この質問のすべての内容について、システムにディスクとファイルシステムが1つしかないとします。 (他のパーティション、ディスク、ファイルシステムには書き込みません)
cat
私は非常に大きな.MTSファイルを1つの巨大な.MTSファイルにマージするプロジェクトを進めています。これを行うには、それぞれの小さなファイルを読み取り、新しいファイルに書き込んでから小さなファイルを削除する必要があります。このように大きなファイルの場合は時間がかかります。
私の理解- ファイルをディスク上の他の場所に読み書きするため、時間cp
がかかります。一方、ファイルはコピーも移動もされません。ファイルへの参照を削除し、新しい場所に新しい参照を作成します。たとえば、ファイルをディスクに保存し、ディスク上のファイルへの参照を削除してから、ディスク上のファイルへの新しい参照を追加します。mv
cp
mv
mv
mv /tmp/foo /tmp/bar
/tmp/foo
/tmp/bar
質問:
cat
cp
これはファイルを新しい場所にコピーするためです。完了したら、より小さなファイルが必要ないほど大きなファイルを使用している場合は、代わりにcat
使用できる同様のものがありますか?mv
cp
理論(私が間違って言ったかもしれない)
ファイルが複数のドライブに分散して保存されることが一般化されました。たとえば、2GBファイルには、ドライブの他の部分に複数の小さなチャンクが格納されているとします。これにより、5Kファイルを削除したときに20MBファイルの一部で上書きできます。 2GBファイルをそのままにしてすべての部分を参照すると、cat foo/* >> bar/bigfile.MTS; rm foo/*
短時間で同じ効果が得られるように見えます。
これを行うことがなく、悪い考えであれば、誰もがなぜ私に例を与えることができますか?散在しているファイルブロックでディスクを乱すのはお勧めできませんか?
答え1
このような既存のツールの最大の障害は、リンクされた各ファイルのサイズ(最後のファイルを除く)がブロックサイズに完全に分割されていない限り(ここでは正しい用語が何であるかわからない)、次のような結果が生じることです。最終ファイルの接続ファイル間にジャンクデータの「間隔」があります。
これは、ファイルデータが通常ファイルシステム内の特定のサイズのブロックに格納されるため、32バイトブロックを使用してファイルシステムに格納されている618バイトファイルは618/32 = 19.3125ブロック、つまり19ブロック全体を占めるためです。約1追加ブロックの/ 3。
私の障害に関係なく、これらの2つのファイルを結合したいと仮定すると、「新しいファイル」は最初のファイルのチャンクと2番目のファイルのチャンクを指すことができます。そうですか?
この簡単なアプローチを使用すると、40ブロックのファイルが作成されます。ここで、ブロック20は1/3は合理的であり、2/3はガベージであり、ブロック21は第2のファイルのデータを開始する。
一部のファイル形式では、ファイルヘッダーに対して巧妙な計算と操作を実行できます。デフォルトでは、アプリケーションにファイルを使用して不要な部分をスキップするように指示できますが、これは正しい計画よりも倉庫に近いものです。 。
答え2
以下はstackoverflowの同様の質問です。https://stackoverflow.com/questions/5893531/fast-concatenate-multiple-files-on-linux
簡単な答えはこれです -
すべてのファイル(最後のファイルを除く)のサイズは、ファイルシステムのブロックサイズの倍数が保証されている場合にのみ機能します。
ファイルシステムは、ファイルの最後まですべてのブロックを読み取る必要があるためです。