1GBのCSVは、ごく普通の表形式データで500万〜1,000万行ほどになります。大事なのはGB数よりこの行数です。スプレッドシート1枚に収まる行数のすでに5倍で、まず「Excelで開く」という選択肢は最初から無かったと受け入れる必要があります。
何が選択肢に残るかは、ひとつの問いで決まります。ファイルを眺めたいのか、それともファイルから答えを引き出したいのか。
- 答えが欲しい(合計、絞り込み、結合、重複の件数など): DuckDB。コマンド1つ、10秒、インポート不要です。
- 眺めたい(スクロール、検索、データの形を把握): ストリーミングで読むビューアを使います。Windowsなら EmEditor、どこでも使えるのは
less、ファイルがスマホにあるならスマホアプリです。 - 編集して保存し直したい: いちばん難しく、良い答えがいちばん少ないケースです。後述します。
比較表
時間は、約800万行・1GBのファイルを、SSD搭載・メモリ16GBの普通のノートPCで開いた場合の目安です。ベンチマークではありません。列の内容やディスクによって変わります。変わらないのは最後の列です。
| ツール | 1GBを開ける? | 最初の行が出るまで | ピークRAM | 費用 |
|---|---|---|---|---|
| Excel | 不可 — 上限1,048,576行 | — | — | 有料 |
| Excel + Power Query | 可(読み込みステップとして) | 数分 | 高い | 有料 |
| Google スプレッドシート | 不可 — 1,000万セル、アップロードは約100MB | — | — | 無料 |
| Numbers | 不可 — 100万行、その前に重くなる | — | — | 無料 |
| DuckDB | 可 | 約1秒 | 約200MB | 無料 |
| Python + pandas | 可(chunksize を使えば) | 30秒以上 | 素朴に使うと5〜10GB | 無料 |
| Python + Polars | 可 | 約5秒 | 約1.5GB | 無料 |
| EmEditor(Windows) | 可、余裕で | 約5秒 | 低い | 有料 |
| VS Code | 厳しい | 30秒以上 | 高い | 無料 |
less / head / awk | 可 | 即時 | ほぼ0 | 無料 |
| OpenRefine | 可(遅い) | 数分 | 高い | 無料 |
| スマホのCSVアプリ | 可(対応して作られていれば) | 数秒 | 自動管理 | 無料枠あり |
この中の2つは罠です。Google スプレッドシートは1,000万セルと謳っていて近そうに聞こえますが、20列のファイルなら50万行で上限に達しますし、その前にアップロード制限で止まります。pandas はファイルを開いてはくれますが、テキスト列をすべてPythonオブジェクトとして持つため、ファイルサイズの8倍のRAMを使います。「開けたけれどスワップが暴れてノートPCが固まった」という報告の正体はこれです。
目的別のやり方
答えが欲しいとき
DuckDB一択です。
duckdb -c "SELECT region, COUNT(*), SUM(amount) FROM 'big.csv' GROUP BY region"
ファイルを並列に読み、読み込むのではなくストリーミングで処理し、クエリの作業領域をほとんど超えてメモリを確保しません。800万行に対するGROUP BYも数秒で終わります。型の上書き、2つのファイルの結合、結果の書き出しまで含めた詳しい手順は、データベースなしでCSVにSQLを実行する方法にあります。
Pythonで済ませたいなら、scan_csv を使う Polars(遅延評価で、読む前にクエリ全体を計画します)か、chunksize と dtype の指定を明示した pandas を使ってください。素朴な pd.read_csv('big.csv') は避けるべきです。
眺めたいとき
Windowsなら EmEditor。 大きなファイルを扱えるエディタとして唯一しっかり耐えられ、数GBのCSVをソートやフィルタ付きのグリッドで開けます。有料ですが、この問題が繰り返し起こるなら元は取れます。
どこでもシェル。 大きなファイルと向き合う最初の5分間では、過小評価されがちです。
head -5 big.csv # what are the columns
wc -l big.csv # how many rows really
awk -F, 'NR<=1000' big.csv > sample.csv # a slice you can open normally
less -S big.csv # scroll it, no line wrapping
1,000行のサンプルを作ってそれを Excel で開けば、ファイル全体を開くどのツールより早く「中身は何か」が分かります。
VS Code も Notepad++ も向きません。 どちらもファイル全体をテキストとしてメモリに読み込みます。開くことは開けますが、遅く、警告が出て、最後に使える表ビューもありません。
ファイルがスマホにあるとき
1GBはここでは難しいケースです。スマホはノートPCよりRAMが少なく、アプリが保持できる量の制限も厳しいからです。スマホで1GBをまるごと快適に開けるものはないので、そう謳うアプリは信用する前に必ず試してください。スマホアプリが得意なのは、その少し下の範囲です。スマホの表計算アプリが黙って切り捨ててしまう、100〜500MB・数十万行のエクスポートです。
大きなファイルを切り捨てずに開き、SQLや普通の言葉でデータに質問できます。スクロールしきれないほど大きなファイルに本当に求めるのは、たいていこれでしょう。iOSとAndroid対応。
できること大事なファイルをスマホアプリに任せる前に、このページの最後のセクションにある確認をしてください。
編集して保存し直したいとき
「編集」とはファイルを保持して書き戻すことなので、このケースは誠実な答えがいちばん少なくなります。
- ピンポイントの修正(値を直す、列を削除するなど): DuckDB か
awkで新しいファイルを書き出します。対話型ツールより速く、元のファイルも無傷で残ります。 - Windowsで本格的に対話編集する: EmEditor。
- それ以外の環境で本格的に対話編集する: 先にファイルを分割します。
split -l 1000000 big.csv part_で表計算ソフトに収まるサイズに分かれますが、あとで結合し直す手間がかかります(catで結合できますが、繰り返された見出し行は削除してください)。 - およそ50万行以下なら、スマホのエディタで直接扱えます。
50万行のファイルを表計算のように編集でき、保存時にすべての行が書き戻されます。無料版でも同じです。iOSとiPadOS対応。
できること問題ごと変換してしまう
ファイルに2回以上触れるなら、CSVとして扱うのをやめましょう。
duckdb -c "COPY (SELECT * FROM 'big.csv') TO 'big.parquet'"
Parquet は列指向で、型があり、圧縮されています。1GBのCSVが100〜200MBになり、数列だけを走査するクエリは5〜20倍速くなり、あれこれ苦労した型もファイルに保存されます。DuckDB、Polars、pandas のどれもそのまま読めます。この記事でいちばん費用対効果の高い10秒です。
ツールが本当に全部開いたかを確認する
大きなCSVを「開く」と言いながら、実は一部だけ開いていて、どこまでかを教えてくれないツールは多くあります。ファイルから結論を出す前に確認してください。
- まずツールの外で行数を数えます:
wc -l big.csv。見出し行の分を1引きます。 - ツールで最終行に移動して、件数を比べます。
- 最終行の内容を
tail -1 big.csvの出力と比べます。
一致しなければ、そのツールは切り捨てています。そこから出した結論(合計、最大値、「その地域の注文は無い」など)は、画面上では何も分からないまま誤ったものになります。大きなファイルで本当に怖いのは、クラッシュよりもこの黙った切り捨てです。クラッシュは少なくとも正直ですから。
失敗したのが Excel だった場合
混同しやすい、隣り合った2つの問題があります。Excelがファイルを拒否した、または一部しか表示しなかったなら、それは行数の上限です。回避策はExcelで開けない大きなCSVファイルを開く方法で紹介しています。Excelがファイルを開いたあとに固まった、応答しなくなった、落ちたというなら、それは別の原因による別の不具合で、Excelが大きなファイルで落ちる理由で解説しています。