出力レートはどのようにハードディスクの書き込みレートよりも高くなる可能性がありますか?Perl:書き込み速度の謎?
アップデート1:私は、次のように変更されました:
アンチウイルスをオフにして。変化なし。
テスト用に新しい物理ディスクを挿入し、最初のパーティション を使用しました。 (最初のテストのディスクは、システムパーティションとは別の最終パーティション でしたが、同じ物理ディスク上の です)。結果:同じ 周期パターンがありますが、システムはで、 が応答なしではなくなりました。書き込み速度は、最初に パーティションを使用しているか、システム パーティションに干渉していないことが原因である可能性があります。 がやや高いです。予備的な結論:システムパーティションから何らかの種類の干渉がありました( )。
インストール済み64ビットPerl。サイクルは終了し、 はすべて2秒のタイムスケールで安定しています。 の55%CPU、シングルコアの書き込み速度は約65 MB /秒です。
64ビットPerlで元のドライブを試しました。結果: の中間です。 8秒のサイクル、CPU20-50%、 35 - 65MB /秒(0-100%の深度サイクルの代わりに、0 - 120MB /秒)システムは軽度に応答しません。 書き込み速度は50 MB /秒です。これは干渉理論を支持する。
Perlスクリプトでのフラッシュ。まだ試していない。
OK、私はfirst hurdleを過ぎました。私はPerlを書いた 非常に大きなテキストファイルを生成することができ、スクリプト(例えば、20 GB)と は、本質的にちょうど数である:
$ラインはでは「\ n」は、長い文字列ですprint NUMBERS_OUTFILE $line;
終わり。
Perlスクリプトは、書き込み速度は約120 MB/sの で開始する(スクリプトによって計算されたものとの間の一貫性、 Process ExplorerおよびパフォーマンスモニタでプロセスのPerl は、「IOは、バイト/秒を書く」。)と100単一コア上の%CPUそれは が実行されています。このレートは、私が信じているのは、ハードディスクの速度を と書くよりも高いです。
その後、システム全体が非常に応答しなくなり、CPUが 0%に降下します(たとえば、20秒と2.7GBが書き込まれた後) 。例えば、 30秒。これらの2つの段階での平均書き込み速度は、 で、ハードディスクの書き込み速度は と一致しています。この の段落に記載されている時間とサイズは、実行ごとに大きく異なります。これまでのところ、第1段階の1GB 〜4.3GBの範囲が観測されています。 ここにはtranscript for the run with 4.3 GBがあります。
これらのサイクルのいくつかのテストで生成された9.2ギガバイトのテキストファイル のためにあります。
何が起こっていますか?
全Perl scriptとBAT driver script( preタグでフォーマットHTML)。 2つの環境変数MBSIZEと OUTFILEが設定されている場合、PerlスクリプトはWindows以外のプラットフォームでは を変更せずに実行できるはずです。
プラットフォーム:Perl 5.10.0 from ActiveState; (最初は32ビット、後で64ビット)。 Windows XP x64 SP2、ページファイルなし、8 GB RAM、AMDクアッドコアCPU、 500 GB Green Caviarハードディスク(書き込み速度85 MB/s?)。
ありがとう。私は64ビットPerlを試しましたが(更新された質問を参照してください)、次のステップはautoflushを有効にすることです。 –
バッファーを保持している場合は、ファイルシステムを変更する必要があるかもしれません。 –
autoflushはすべてのprint要素の後にシステムコールを行います。あなたの例では、一度に1 MBなので、パフォーマンスは良いでしょう。しかし、 'a'、 'b'、 'c'、 'd'を印刷すると、それぞれ1つの文字の4つのシステムコールがあるので、非常に悪いことになります。 –