サイズが31GBのXMLファイルがあります。そのファイルの合計行数を見つける必要があります。私はコマンドwc -l
が私に同じことを与えることを知っています。ただし、この操作を実行するには時間がかかりすぎます。大きなファイルの行数を見つけるためのより高速なメカニズムはありますか?
6 に答える
31 GB は非常に大きなテキスト ファイルです。約 1.5 ギガまで圧縮されると思います。最初にこれらのファイルを圧縮形式で作成し、wc を介してファイルの解凍バージョンをストリーミングできます。これにより、このファイルの処理に使用される I/O とメモリの量が大幅に削減されます。gzip は、圧縮されたストリームを読み書きできます。
しかし、私は次のコメントもします。
- 要素間の空白は無視されるため (混合コンテンツを除く)、行番号は XML にとってそれほど有益ではありません。データセットについて本当に知りたいことは何ですか? 要素をカウントする方が便利だと思います。
- xml ファイルが不必要に冗長でないことを確認してください。たとえば、ドキュメント全体で同じ名前空間宣言を繰り返していませんか?
- おそらく XML は、この文書を表現する最良の方法ではありません。Fast Infosetのようなものを調べてみてください。
行数だけが必要な場合は、wc -l
他の何よりも高速になります。
問題は31GBのテキストファイルです。
精度が問題にならない場合は、行の長さの平均を求め、それでファイル サイズを割ります。そうすれば、非常に高速な近似を得ることができます。(使用される文字エンコーディングを考慮してください)
これは、問題を完全に回避するためにコードをリファクタリングする必要があるポイントを超えています。これを行う 1 つの方法は、代わりにファイル内のすべてのデータをタプル ストア データベースに配置することです。この目的で使用できる 2 つのシステムは Apache カウチ DB と Intersystems Cache であり、扱うデータの種類に合わせてはるかに最適化されています。
本当に xml ファイルに行き詰まっている場合は、別のオプションとして、事前にすべての行をカウントし、この値をキャッシュすることもできます。ファイルに行が追加または削除されるたびに、ファイルに行を追加または削除できます。また、2^32 行を超える可能性があるため、必ず 64 ビット整数を使用してください。
No, not really. wc
is going to be pretty well optimized. 31GB is a lot of data, and reading it in to count lines is going to take a while no matter what program you use.
Also, this question isn't really appropriate for Stack Overflow, as it's not about programming at all.