私はLinuxクラスタで多くのタスクを実行しています。各ジョブは複数の出力ファイルを生成します。すべてのジョブが完了したら、アーカイブの作成などのtar cf foo.tar output_files/
ジョブを実行しますtar
。何千ものファイルとディレクトリがあるので、これは非常に遅いプロセスです。
出力ファイルの生成中にこれを並列に実行する方法はありますか?
tar
複数のプロセスを複数のシステムに分散させ、同時に同じアーカイブにファイルを追加することは可能ですか?
クラスタには共有ファイルシステムがあります。
圧縮すると速度が遅くなり、すべての入力ファイル自体がすでに圧縮されているため、圧縮には興味がありません。理想的には出力はファイルですが、tar
他のアーカイブ形式も考えてみましょう。
答え1
同じtarアーカイブ(または圧縮されているかどうかにかかわらず、他の一般的なアーカイブ形式)に複数のプロセスを追加することはできません。各ファイルは連続して保存され、ファイルにデータを挿入することはできず、追加または上書きするだけで、最後のファイル以外のファイルに書き続けると、次のファイルが上書きされます。
ファイルサイズを事前に知っている場合は、tarアーカイブにそのサイズを維持し、プログラムに書き込みを続けることができます。これには多くのコーディングが必要です。これは非常に珍しいことです。
Unixには、独立して作成されたファイルセットに対応するように設計された機能があります。ディレクトリと呼ばれます。
まれに、ディレクトリの圧縮されていないアーカイブから必要なものを得ることができます。場合によっては、読み取り速度がやや速くなることがあります。これは、アーカイブ形式(各ファイルアイテムがそのコンテンツへのポインタである)ではなく、ディレクトリ形式(各ファイルアイテムがそのコンテンツへのポインタである)の固有の結果です。ディレクトリをフラグメントに編成することが可能になりました。ディレクトリツリーをアーカイブに変換することは、順番に実行する必要がある後処理です。
答え2
すべての出力ファイルが生成される前に最終ファイルの生成を開始できますtar
。これにより、希望の速度を得ることができます。
次のようにtarを呼び出すことができます。
tar -cf foo.tar -T file-list
file-list
FIFOになります。検出するにはスクリプトが必要です。
ソースディレクトリの新しいファイル(
inotifywatch
)各新しいファイルが完了したら(
fuser
)
ファイルが完了すると、そのパスがFIFOに書き込まれます。パスが完全に混合されたアーカイブを作成しないと便利です。最初の入力ファイルのディレクトリをインポートすることから始め、最後のファイルが完了した後にのみ新しいディレクトリを追加できます(プロセスが完了した後にフラグファイルを作成します)。最初のアプローチの利点は、ファイル全体がキャッシュに存在できることです。
答え3
GNU tarには--appendがあります:
tar -f foo.tar --append newfiles
残念ながら、tarファイル全体を読みます。