web-dev-qa-db-ja.com

複数のtarプロセスが同じアーカイブファイルに一度に書き込む

Linuxクラスターで多くのタスクを実行しています。各タスクは多くの出力ファイルを作成します。すべてのタスクが終了したら、tar cf foo.tar output_files/のようなものを実行してtarアーカイブを作成します。何千ものファイルとディレクトリがあるため、これは非常に遅いプロセスです。

出力ファイルが作成されているときにこれを並行して行う方法はありますか?

複数のtarプロセスを複数のマシンに分散させ、すべてのファイルを同じアーカイブに一度に追加することは可能ですか?

クラスタには共有ファイルシステムがあります。

圧縮はさらに遅くなり、すべての入力ファイル自体がすでに圧縮されているため、圧縮には興味がありません。理想的には出力はtarファイルですが、他のアーカイブ形式も検討します。

6
user74089

同じtarアーカイブ(または圧縮されているかどうかに関係なく、他の通常のアーカイブ形式)に複数のプロセスを追加することはできません。各ファイルは連続して保存され、ファイルにデータを挿入する方法はなく、追加または上書きするだけです。そのため、最後ではないファイルに書き込みを続けると、後続のファイルが上書きされます。

事前にファイルサイズがわかっている場合は、tarアーカイブでサイズを予約して、プログラムに書き込みを続けることができます。それには多くのコーディングが必要になります。それは非常に珍しいことです。

Unixには、独立して書き込まれるファイルのグループに対応するように設計された機能があります。それはディレクトリと呼ばれます。

ディレクトリ上の非圧縮アーカイブから何かを得るケースはほとんどありません。状況によっては、それを読む方が少し速いかもしれません。これは、アーカイブ形式(各ファイルエントリがそのコンテンツに直接含まれる)とは対照的に、ディレクトリ形式(各ファイルエントリがそのコンテンツへのポインタである)の本質的な結果であり、ディレクトリを区分的に構築することを可能にします。 。ディレクトリツリーをアーカイブに変換することは後処理であり、順番に実行する必要があります。

すべての出力ファイルが作成される前に、最終的なtarファイルの作成を開始できます。おそらくそれはあなたが望むスピードアップを達成します。

Tarは次のように呼び出すことができます。

tar -cf foo.tar -T file-list

file-listはFIFOになります。検出するスクリプトが必要です

  1. ソースディレクトリ内の新しいファイル(inotifywatch

  2. これらの新しいファイルのそれぞれが終了したとき(fuser

ファイルが終了すると、そのパスがFIFOに書き込まれます。パスが完全に混在するアーカイブを作成しないと便利な場合があります。最初の入力ファイルを取得するディレクトリから開始し、最後のファイルが終了した後にのみ新しいディレクトリを追加できます(それぞれのプロセスが終了した後にフラグファイルを作成します)。最初のアプローチには、おそらくファイルがまだ完全にキャッシュにあるという利点があります。

3
Hauke Laging

GNU tarには--append:があります。

tar -f foo.tar --append newfiles

残念ながら、tarファイル全体を読み取ります。

0
Ole Tange