大きなファイル(> 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バイトのオフセットは問題ありません。
NTFSを使用していますか? exFATのようなクレイジーなファイルシステムではありません... – rodrigo
何かが間違っています。シークは遅いものの、数秒で測定すべきではありません。あなたのコードをより多く表示できますか? – Leon
@rodrigo私はNTFSを使用します – Krustenkaese