1TBのディスク容量を持つシステムの700GB txtファイルから最初の3億行を削除する方法は?

1TBのディスク容量を持つシステムの700GB txtファイルから最初の3億行を削除する方法は?

合計ディスク容量が1TBで、空き容量が300GBのシステムの700GBテキストファイルから最初の3億行を削除するにはどうすればよいですか? (私のシステムには2GBのRAMがあります。)私が見つけた答えはsed、tail、headを使います。

しかし、私の意見では(修正してください)ディスク容量が1TBに制限されており、処理中に新しいファイルを作成したりtmpファイルがあるため使用できません。

このファイルにはJSON形式のデータベースレコードが含まれています。

ベストアンサー1

最初のn行(またはバイト)を削除するには、次のddものを使用できます。循環装置を使用する)。一時ファイルを使用せず、サイズ制限もありません。ただし、進行状況追跡がなく、エラーが発生するとファイルが破損する可能性があるため危険です。

はい:1000行のサンプルファイルを作成します。

$ seq 1 1000 > 1000lines.txt
$ head -n 3 1000lines.txt
1
2
3
$ tail -n 3 1000lines.txt
998
999
1000

最初の300行を削除しようとしています。何バイトに対応していますか?

$ stat -c %s 1000lines.txt
3893 # total bytes
$ head -n 300 1000lines.txt | wc -c
1092 # first 300 lines bytes
$ echo $((3893-1092))
2801 # target filesize after removal

ファイルは3893バイトで、最初の1092バイトを削除し、2801バイトの新しいファイルを残そうとします。

これらのバイトを削除するには、GNUddコマンドを使用します。conv=notruncそれ以外の場合は、ファイルの内容がコピーされる前にファイルが削除されます。

$ dd conv=notrunc iflag=skip_bytes skip=1092 if=1000lines.txt of=1000lines.txt
5+1 records in
5+1 records out
2801 bytes (2.8 kB, 2.7 KiB) copied, 8.6078e-05 s, 32.5 MB/s

これにより、最初の300行が削除されますが、ファイルがまだ切り捨てられていないため、最後の1092バイトが複製されます。

$ truncate -s 2801 1000lines.txt

これにより、ファイルが最終サイズに縮小され、ファイルの末尾に重複した行が削除されます。

結果:

$ stat -c %s 1000lines.txt 
2801

$ head -n 3 1000lines.txt
301
302
303

$ tail -n 3 1000lines.txt
998
999
1000

大きなファイルの場合でも、プロセスは似ています。パフォーマンスを向上させるために、より大きなブロックサイズを設定する必要があるかもしれません(ブロックサイズオプションddbs)。

主な問題は、正しい行番号の正しいバイトオフセットを決定することです。通常、これは読んで世紀を通してのみ実行できます。このアプローチでは、ファイルの大部分を削除しても、ファイル全体を1回以上読み取る必要があります。

おすすめ記事