2016-06-15 23 views
-4

大きなファイル(> 4GB)全体のランダムな場所でデータを読み込むときに何か問題が発生しました。
タスクは3Dデータキューブをファイルに保存し、データセット全体をRAMにロードしないで軸を転置することです。
保存形式は次のとおりです。
ファイルの先頭に3の整数があり、次元(nX、nY、nZ)を格納しています。
その後、データは長さnXの行としてデータに従います。
これらの行はny回繰り返され、ページが作成され、ページはnZ回繰り返されます。
意味:
ラインがnXをバイト
ページはnXを* nyが
ファイルiは、次のループを実行し、データセットを転置するnXを* NY * NZ + 12バイト
ているバイトを持っています
C++で大きなファイルをランダムに読み込むとスローダウン

for(int i=0;i<nY;i++) 
{ 
    for(int j=0;j<nZ;j++) 
    { 
     read(pBuf, i*nX+j*nY*nX);//read nX bytes from offset i*nX+j*nX*nY 
     writeNext(pBuf); 
    } 
} 

fopen、_fseeki64、freadを使用すると、 6回ごとの読み込みの30%は7秒かかります。何百万もの読み込みがあるので、これらの遅延を受け入れることはできません。 私はメモリマップされたファイル(CreateFile、CreateFileMapping、MapViewOfFile)と同じアルゴリズムを実装しましたが、現在は6回ごとに約2秒かかります。
読み取り速度を上げる方法/チャンスはありますか?

EDIT1:私はhttp://pastebin.com/MejiTKj0
EDIT2でいくつかのコードを追加しました

一部は、読み取り機能でオフセットに関する矛盾に気づくことがあります。問題を単純化するために、ファイルヘッダーに保存されているすべての変数については言及していませんでした。したがって、15バイトのオフセットは問題ありません。

+0

NTFSを使用していますか? exFATのようなクレイジーなファイルシステムではありません... – rodrigo

+0

何かが間違っています。シークは遅いものの、数秒で測定すべきではありません。あなたのコードをより多く表示できますか? – Leon

+0

@rodrigo私はNTFSを使用します – Krustenkaese

答えて

0

ありがとうございます。 実際に最初にチェックしておかなければならないのは、必要なデータを提供することができなかったHDDです。
私は現在、SSDデバイスに切り替えることを考えています。

0

ファイルが保存されているHDDディスクを使用している場合、シークタイムは、ランダムアクセスを実行しようとしています。ファイル全体を順番にメモリに読み込むほうがいいかもしれません(シークに比べて比較的速い操作です)、代わりにメモリデータを処理してください。これは、ファイルデータ全体のうち比較的小さな割合しか必要ない場合でも、これがより迅速であることがわかります。

+0

とにかく、HDDのシーク時間は決して6秒にならないはずです!より良い説明が必要です。 – rodrigo

0

ループでは、Z/nZは最も外側のループであり、Yは内側のループである必要があります。記憶メモリのレイアウトがnZページを1つずつ保存している場合、それはシーク時間を節約する。

表示されている現在のコードでは、内部ループにnZが表示されますが、これは問題ありません。現在のループの配置は、ブックの各ページの最初の行を読み、次に2行目を読むなど、ブックの読み方に似ています。

+0

これは、書き込みが連続するように、意図的に行われています。 – Leon

関連する問題