私はいくつかのファイルI/O(読み取り、書き込み)と計算を実行するアルゴリズムを持っています。テープから良好な読み取りパフォーマンスを得るには?
テープに書き込む(読み込まない)場合、アルゴリズムは素晴らしいです。私がテープから(筆記なしで)読むと、パフォーマンスが悪いです。テープが方程式(I/O用のディスク)から抜け出せば、それはうまくいく。
今、私はそれを私が理解しようとしている比較的単純なケースに煮詰めました。
セットアップはテープ上の単一の20 GBファイルです。私はこのファイルをブロック単位で逐次読んでいます。
while (fileRemaining)
{
ReadBlock(blockSize);
Sleep(sleepTime); // this is to mimic computation time
}
いくつかの観察:
- が8Kのブロックサイズを使用して、0のスリープ時間、スループット(データ/秒リード)良い
テストアルゴリズムのようなものです。さらに、テープドライブは常にノイズを発生しています。
- blockSizeを8Kに設定し、スリープ時間が0でない(1msさえ)場合、スループットはひどく悪くなります。データはまだ読み込まれますが、テープドライブは定期的にノイズを生成しません。時折騒音がするとしばらく静かになる。
- 2MのblockSizeと100msのsleepTimeを使用する場合、スループットは良好です。テープドライブはノイズを全時間に掛けます(ただし、音は遅く聞こえます)。
- Windowsエクスプローラは、スループットの良いファイルをテープからディスクに転送できます。
ここでどのように良好な読み取りパフォーマンスを得ることができますか?
他の謎を理解するのを助けてくれるなら、睡眠の存在がそのスループットを大幅に低下させるのはなぜですか(このことがアルゴリズムの再考に役立つことがわかっています)。一度にテープから読み取る "最適な"量は何ですか?テープドライブからのノイズも通知に関連していますか?
RAMに保存されているデータ量を最小限に抑えるために、ブロックを読み込みます。そのような小さなブロックサイズを使用する必要はありません。 – Blender
テープドライブの読み取り速度はどれくらいですか? 80MB/sの場合は、シークオーバーヘッドがないと仮定して8KBを読み取るのに0.1msかかるでしょう。だから明らかに、対応する1msの睡眠は物事を大幅に遅くします。 –
@OliCharlesworth申し訳ありません。私は約80 MB/sだと信じています。あなたの分析は正しいです、私たちは、およそ規模の大きな減速を予想する必要があります。現在は8KBの読み込みには1.1msかかり、それはおよそ7.1MB /秒に変換されます。しかし、現実には150KB/s未満で読んでいます。 – jglouie