あまりにも多くのメモリや一時ディスクを使用せずに事前ソートされたファイルを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ファイル名...>

    • 即時出力

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

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

おすすめ記事