2012-04-25 5 views
1

私はいくつかのファイル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エクスプローラは、スループットの良いファイルをテープからディスクに転送できます。

ここでどのように良好な読み取りパフォーマンスを得ることができますか?

他の謎を理解するのを助けてくれるなら、睡眠の存在がそのスループットを大幅に低下させるのはなぜですか(このことがアルゴリズムの再考に役立つことがわかっています)。一度にテープから読み取る "最適な"量は何ですか?テープドライブからのノイズも通知に関連していますか?

+0

RAMに保存されているデータ量を最小限に抑えるために、ブロックを読み込みます。そのような小さなブロックサイズを使用する必要はありません。 – Blender

+0

テープドライブの読み取り速度はどれくらいですか? 80MB/sの場合は、シークオーバーヘッドがないと仮定して8KBを読み取るのに0.1msかかるでしょう。だから明らかに、対応する1msの睡眠は物事を大幅に遅くします。 –

+0

@OliCharlesworth申し訳ありません。私は約80 MB/sだと信じています。あなたの分析は正しいです、私たちは、およそ規模の大きな減速を予想する必要があります。現在は8KBの読み込みには1.1msかかり、それはおよそ7.1MB /秒に変換されます。しかし、現実には150KB/s未満で読んでいます。 – jglouie

答えて

1

ドライブで使用されているテープメディア、ドライブ、またはインターフェイスの種類に関する詳細は指定していません。

LTO4/5のような現在の技術は、約240~280MB/sでデータを配信することができます。パフォーマンスは、LTOの最適なブロックサイズで読み取ることによって達成されます。これは64KBと思われます。最大256KBまでのブロックサイズは大きな影響を与えませんが、小さなブロックをたくさん読んでも影響はありません。より大きなブロックで読み書きし、読み込んだプログラム内でデータを分割します。データが既に8KBブロックのテープにある場合は、ドライブを固定ブロックモードに設定し、複数の8KBブロックを読み込みます。

テープドライブは、データを読み取るために特定の動き速度に達しなければなりません。データがドライブから十分に速くストリーミングされない場合、ドライブは減速、停止、巻き戻し、再配置、速度の戻った後、再度読み込みを開始する必要があります。この停止/開始はパフォーマンスに大きな影響を与えます。 LTOは、異なるテープ速度で読み込めるようにすることでこれを補うようにしていますが、限界があります。

非同期I/Oを使用すると、速度をさらに向上させることができますが、このアプリケーションでは必要ないとは思われません。