大規模なファイルがあり、少数の大きなデータセットが含まれています。各データセットには名前とデータセットサイズ(バイト数)が含まれており、スキップして次のデータセットに移動できます。大きなファイルでスキップするC++ /高速ランダムアクセス
データセット名のインデックスを非常に迅速に作成したいと考えています。ファイルの例は約21MBで、88個のデータセットを含んでいます。 std::ifstream
とseekg()
を使用して88個の名前をすばやく読み取ると、データセット間をスキップするのに約1300msかかりますが、これを削減したいと考えています。
実際、私は21MBファイル内の所定の位置で約30バイトの88個のチャンクを読んでおり、1300ミリ秒かかります。
これを改善する方法はありますか、それともOSとファイルシステムの制限ですか?私はWindows 7 64bitの下でテストを実行しています。
私は、ファイルの先頭に完全なインデックスを持つ方が良いと思っていますが、ファイル形式にはこれがなく、変更できません。
いくつかのヒントhttp://stackoverflow.com/questions/5166263/how-to-get-iostream-to-perform-better –
これらのテキストファイルはありますか? Windowsはラインの最後に改行と改行の両方を保存しますか?もしそうなら、ifstreamで論理テキストファイルを検索し、キャリッジリターン文字をフィルタリングしますか?もしそうなら、おそらくあなたは生のバイナリモードでファイルを開くことができます。シークオフセットにCRを含まないようにシーク機能がすべての文字を読み込まないようにしますか?しかし、もちろん、あなたのコードは、フィルタリングされていないキャリッジリターンを無視しなければならないかもしれません。 – WaltK
データフォーマットが変更されていない88個の小さなファイルに分割していますか? – norca