あまりにも多くのメモリや一時ディスクを使用せずに事前ソートされたファイルを1つの大容量ファイルにマージする方法

あまりにも多くのメモリや一時ディスクを使用せずに事前ソートされたファイルを1つの大容量ファイルにマージする方法

1.4TBファイルをソートしようとしています(重複行を削除することをお勧めします)。

個々のチャンクを分割してソートすることは問題ではありませんが、再組み立てするのは難しいことです。私はマニュアルページで、「sort -m」(FreeBSD 11の下)が単純なマージを実行して完全に整列された集計出力を生成し、オプションで-uオプションを使用して重複を抑制すると予想しました。

しかし、しばらく実行した後、入力が正常にソートされているかのように(これまで)、何百もの一時ファイルが生成されたことがわかりました。

同じデータを3回保存するにはディスク容量が不足しています。一時ディスク領域なしでソートされたファイルを簡単にマージするユーティリティはありますか?

===結果===

結局、「標準」ソートを使用するようになりました。処理には、何百もの一時ファイルの作成を含む約50時間の高いCPUとディスクのロードが必要でした。これは、入力がすでに完全に整列しているという事実にもかかわらず発生します。あらかじめソートされたファイルをきれいにマージできる簡単なユーティリティがあるかどうかを知りたいです。

答え1

今日、他のデータでさらに実験をした後に問題を発見した可能性があると思います。デフォルトでは、sort(BSD)は一度に16個のファイルのみを開きます(マンページでは、ここに入力ファイルと一時ファイルが含まれていることを示唆しているようです)。 。

--batch-size=スイッチを使用すると、この数を増やすことができます。

100 MBサイズの事前ソートされたファイルを使用する:

  1. sort -u -m <...15ファイル名...>

    • 即時出力
  2. sort -u -m <...16ファイル名...>

    • 一時ファイルの中間使用を含む少なくとも2つの別々のチャンクで入力を処理するようです。
  3. タイプ--バッチサイズ=20-u -m <...16ファイル名...>

    • 即時出力

生データではこれをテストできませんが、これが問題であると確信しています。

これが同じ問題を抱えている人に役立つことを願っています。

答え2

あなたの要件(したがってバックアップメモリ​​/ストレージ/クラウド)は非常に遅くなりますが、独自のファイルシステムドライバを書くことで可能です。しかし、そうする時間/技術があれば、$37 2TBのドライブをリース/購入/販売/返却して使用する方が速く/安いでしょう。

https://en.m.wikipedia.org/wiki/External_sorting

ファイルが圧縮可能な場合、ソリューションはzramおよび/または7z / fs圧縮にすることができます。 2番目のコピー用のスペースを作成できます。

https://en.m.wikipedia.org/wiki/Zram

https://en.m.wikipedia.org/wiki/Category:圧縮ファイルシステム

入力を削除せずに出力するスペースがあり、入力があらかじめソートされている場合は問題になりません。

答え3

非常に大きなスライダーパズルを解いて、同様の問題に遭遇しました。現在、約100個のソートされたファイルをマージする必要があり、各ファイルには約6000万の場所が含まれており、15GBを占めています。ファイルは重複せずに個別にソートされますが、異なるファイルが同じ履歴を持つことがあります。

私は基本的にすべてのファイルを開き、一度に各ファイルから1つのレコードを読み取るユーティリティをC ++で書いた。各ステップで、最も古いアルファベット順のレコード(SHELLソートを使用)を見つけてそのレコードを書き込みます。このファイルと同じレコードを持つ別のファイルから次のレコードを読みます。答えを得るために、新しいMACノートブックで5時間実行しました。

メモリ要件は大きくなく、各ファイルは一度だけ読み取られます。これは一度に2つのファイルに制限され、ファイルを複数回読み取る通信ソリューションよりもはるかに高速です。

このプログラムは、2台のコンピュータ、つまりプログラムが最初に開発されたMACラップトップとMAC M1でコンパイルされ実行されました。これまでに実行された最大のタスクには676個のファイルがあり、各ファイルのサイズは約6000万個、つまりサイズが1.5GBで、実行には10時間以上かかりました。

ソースコード:ブリュッセルモス/

答え4

私の考えであなたが探しているのはですcomm。どのくらいのメモリや一時スペースを使用しているのかわかりませんが、入力ファイルを並べ替える必要があるという要件と、これらのユーティリティを書く人が愚かではないことを考慮すると、本当に効率的であると確信しています。

uniq入力が整列していると仮定するため、重複排除を使用できます。

https://www.tutorialspoint.com/unix_commands/comm.htm

関連情報