Linuxクラスターで多くのタスクを実行しています。各タスクは多くの出力ファイルを作成します。すべてのタスクが終了したら、tar cf foo.tar output_files/
のようなものを実行してtar
アーカイブを作成します。何千ものファイルとディレクトリがあるため、これは非常に遅いプロセスです。
出力ファイルが作成されているときにこれを並行して行う方法はありますか?
複数のtar
プロセスを複数のマシンに分散させ、すべてのファイルを同じアーカイブに一度に追加することは可能ですか?
クラスタには共有ファイルシステムがあります。
圧縮はさらに遅くなり、すべての入力ファイル自体がすでに圧縮されているため、圧縮には興味がありません。理想的には出力はtar
ファイルですが、他のアーカイブ形式も検討します。
同じtarアーカイブ(または圧縮されているかどうかに関係なく、他の通常のアーカイブ形式)に複数のプロセスを追加することはできません。各ファイルは連続して保存され、ファイルにデータを挿入する方法はなく、追加または上書きするだけです。そのため、最後ではないファイルに書き込みを続けると、後続のファイルが上書きされます。
事前にファイルサイズがわかっている場合は、tarアーカイブでサイズを予約して、プログラムに書き込みを続けることができます。それには多くのコーディングが必要になります。それは非常に珍しいことです。
Unixには、独立して書き込まれるファイルのグループに対応するように設計された機能があります。それはディレクトリと呼ばれます。
ディレクトリ上の非圧縮アーカイブから何かを得るケースはほとんどありません。状況によっては、それを読む方が少し速いかもしれません。これは、アーカイブ形式(各ファイルエントリがそのコンテンツに直接含まれる)とは対照的に、ディレクトリ形式(各ファイルエントリがそのコンテンツへのポインタである)の本質的な結果であり、ディレクトリを区分的に構築することを可能にします。 。ディレクトリツリーをアーカイブに変換することは後処理であり、順番に実行する必要があります。
すべての出力ファイルが作成される前に、最終的なtar
ファイルの作成を開始できます。おそらくそれはあなたが望むスピードアップを達成します。
Tarは次のように呼び出すことができます。
tar -cf foo.tar -T file-list
file-list
はFIFOになります。検出するスクリプトが必要です
ソースディレクトリ内の新しいファイル(inotifywatch
)
これらの新しいファイルのそれぞれが終了したとき(fuser
)
ファイルが終了すると、そのパスがFIFOに書き込まれます。パスが完全に混在するアーカイブを作成しないと便利な場合があります。最初の入力ファイルを取得するディレクトリから開始し、最後のファイルが終了した後にのみ新しいディレクトリを追加できます(それぞれのプロセスが終了した後にフラグファイルを作成します)。最初のアプローチには、おそらくファイルがまだ完全にキャッシュにあるという利点があります。
GNU tarには--append:があります。
tar -f foo.tar --append newfiles
残念ながら、tarファイル全体を読み取ります。