1

ファイル内の各セクションのオフセットと長さを示すヘッダーを持つセクションに実装されているカスタム ファイル タイプがあります。

現在、ファイルを操作したいときはいつでも、前もって全体をロードして解析するか、必要なセクションだけを選択してロードする必要があります。

私がやりたいことは、各セクションがオンデマンドで読み込まれるハイブリッド アプローチを実現することです。

ただし、これを行うと、ファイルシステムのハンドルを必要以上に開いたままにしておくことや、コードの複雑さが増すという点で、多くの潜在的な欠点があるようです。

この種の標準パターンはありますか?私のオプションは次のようです:

  1. ファイル全体をロードするだけで、無駄なサイクル/メモリについて不満を言うのをやめます
  2. ファイル全体を raw バイトとしてメモリにロードし、ディスクではなくメモリ バッファからアンロードされたセクションの要求を満たします。これにより、不要なセクションを解析するコストが節約され、必要なメモリが少なくなります (ディスク表現がその周りのオブジェクト モデルよりもはるかにコンパクトであるため)。
  3. 必要なセクションをすぐにロードしてファイルを閉じますが、ファイルのソースの場所は保持します。その後、別のセクションが要求された場合は、ファイルを再度開いてデータをロードします。この場合、基になるファイルが変更されると、奇妙な結果が得られる可能性があります。
  4. 上記と同じですが、ファイル ハンドルを開いたままにします (おそらく読み取り共有を許可します)。
  5. Memory-Mapped IO を使用してファイルをロードし、ファイルのビューを開いたままにします。

何かご意見は

4

2 に答える 2

1

可能であれば、ランダム アクセス パターンを使用している場合は、ファイル全体を MMAP するのが通常最も簡単な方法です。このようにして、ロード/アンロードの問題を OS に委任するだけで、1 と 2 を無料で利用できます。

非常に特殊なアクセス パターンがある場合は、 fadvise() のようなものを使用して (Win32 とまったく同じではありません)、アクセスの意図を OS に伝えることもできます。

ファイルが 2GB を超える場合は、64 ビットを使用するか、必要に応じてファイルを mmap() することができます。

于 2009-07-29T15:24:16.447 に答える
1

ファイルが比較的小さい場合は、ファイル全体を mmap するだけで十分です。ファイルが大きい場合は、mmap ビューを開いたままにし、必要に応じてファイル内で移動し、サイズを変更して各セクションを表示することができます。

于 2009-07-30T01:42:05.590 に答える