0

私は大きなビデオファイルを連結するための小さなユーティリティアプリに取り組んでいます。主な連結手順は、Windows7のコマンドラインで次のようなものを実行することです。

copy /b file1.dv + file2.dv + file3.dv output.dv

入力ファイルは大きく、通常はそれぞれ7〜15GBです。ここで大量のデータを処理していることは知っていますが、バイナリ連結には非常に長い時間がかかります。合計で約40 GBのデータの場合、ほぼ1時間かかる可能性があります。

プロセスは基本的に各ファイルをスキャンしてその内容を新しいファイルにコピーするだけであることを考えると、バイナリコピーが非常に遅いのはなぜですか?

4

1 に答える 1

1

組み込みコマンドcopyはDOS時代に設計されたものであり、それ以降は実際には更新されていません。その結果、ディスクが小さく、プライマリメモリが非常に小さいマシン向けに設計されました。その結果、物事をコピーするときに非常に小さなバッファーを使用します。一般的なワークロードの場合。これは大したことではありませんが、あなたが扱っている特定のケースではうまくいきません。

とは言うものの、あなたが説明するシナリオを考えると、コピーがそれほどゆっくりと進んでいるとは思いません。40ギガバイトのファイルに約1時間かかる場合は、約11 MB/sの速度が得られていることを意味します。。コメントで説明しているような一般的なコモディティのDellラップトップには、通常5400 RPMの消費者向けハードディスクが搭載されており、シーケンシャル読み取りと書き込みます。ただし、ワークロードはシーケンシャルワークロードではありません。これは、読み取り/書き込みヘッドがソースファイルからターゲットファイルに絶えずシフトすることです。このようなディスクの場合、通常16ミリ秒のレイテンシを投入すると、1秒あたり約60回のシーク、つまり1秒あたり30回のコピー操作が可能になります。これは、コピーが約11MB / 30 =約375kのバッファーを使用していたことを意味します。これは、便利なことに(copyのコードといくつかのDOSデバイスドライバ)は、コピーが元々設計されていた640kの上限の下に収まります。これはすべて、ディスクが理想的な条件下で動作しており、コピー操作内でこれらの読み取りと書き込みを実際に順次実行できるようにするための十分な空き容量があることを前提としています。

もちろん、他のことを同時に行うと、シーク操作が増え、パフォーマンスが低下します。

大規模なコピー操作用に設計された別のアプリケーションを使用すると、おそらくより良い結果が得られます(おそらく最大2倍の速度)。そのため、より大きなバッファーを使用します。しかし、私はそのようなアプリケーションを知りません。それがあなたが必要とするものであるならば、あなたはおそらくあなた自身でそれを書く必要があるでしょう。

于 2012-07-28T04:14:01.713 に答える