web-dev-qa-db-ja.com

過剰なメモリや一時的なディスクを使用せずに、事前にソートされたファイルを単一のBIGファイルにマージする方法

1.4TBのファイルから並べ替え(理想的には重複行を削除)しようとしています。

個々のチャンクの分割と並べ替えは問題ではありませんが、それらを再組み立てすることは困難であることが判明しています。マニュアルページから、 'sort -m'(FreeBSD 11では)が単純なマージを行い、完全にソートされた集計出力を作成し、オプションで-uオプションを使用して重複を抑制することを期待していました。

しかし、しばらく実行したままにしておくと、通常のように入力を並べ替えているかのように、並べ替えによって(これまでのところ)数百ギガ相当の一時ファイルが生成されていることがわかりました。

同じデータを3回保存するのに十分なディスク容量がありません。一時的なディスクスペースを必要とせずに、すでにソートされたファイルの単純なマージを実行できるユーティリティはありますか?

===結果===

最終的に「標準」ソートを使用しました。数百の一時ファイルの生成を含め、処理には約50時間の高いCPUとディスクの負荷がかかりました。これは、入力がすでに完全にソートされているにもかかわらずでした。事前にソートされたファイルをきちんとマージするための簡単なユーティリティがあるかどうか、私はまだ学びたいと思っています。

4
rowan194

あなたの要件(スペアのRAM /ストレージ/クラウド)はこれを本当に遅くしますが、あなた自身のファイルシステムドライバーを書くことによってそれは可能です。ただし、それを行う時間/スキルがある場合は、37ドルの2TBドライブをレンタル/購入/販売/返品して使用する方が速く/安くなります。

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

ファイルが圧縮可能である場合、回避策はzramおよび/または7z/fs-compressionである可能性があり、2番目のコピー用のスペースを確保できます。

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

https://en.m.wikipedia.org/wiki/Category:Compression_file_systems

入力を削除せずに出力用のスペースがあり、入力が事前にソートされている場合、それは簡単です。

2
user1133275

データのいくつかの特性を知ることは役に立ちます。重複が多い場合(たとえば、出力が元の1.4TBのデータの1GBのみであると予想される場合)、使用できるいくつかのトリックがあります。あるいは、他の重複していないデータの間に散在している特定の一般的な重複(特別な場合もあります)はありますか?

また、マージされる個々のファイルのそれぞれは、すでに重複排除されていますか?入力ファイルは、高レベルの圧縮が有効になっているZFSデータセットに保存されていますか?これにより、余分なディスク領域が絞り出される可能性もあります。特に、オリジナルを分割してすべてのピースをディスクに置くことができる場合。

2
Gumnos

今日、さまざまなデータでさらに実験を行ってみると、問題が見つかった可能性があります。デフォルトでは、sort(BSD)は一度に16個のファイルしか開きません(manページは入力ファイルと一時ファイルの両方が含まれていることを示しているようです)。

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

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

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

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

    • 一時ファイルの中間使用を含め、少なくとも2つの別々のチャンクで入力を処理しているようです
  3. ソート --batch-size = 20 -u -m <... 16ファイル名...>

    • 即時出力

元のデータでこれをテストすることはできませんでしたが、これが問題であったことはかなり確信しています。

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

1
rowan194

これは、HadoopファイルシステムのSparkに適したものではないでしょうか? Apache Zeppelin(Spark用のJupyterスタイルのノートブック)を入手して、いくつかのチュートリアルを試してみることをお勧めします。 Sparkは、ビッグデータを利用する方法です。

0
Bruce Graham

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

uniqを使用すると重複を削除できます。これは、ソートされた入力も想定しているためです。

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

0
roasm