ファイル内の各セクションのオフセットと長さを示すヘッダー付きのセクションで実装されたカスタムファイルタイプがあります。オンデマンドでカスタムファイルを開く
現在のところ、ファイルとやりとりしたいときは、ファイル全体をロードして解析するか、必要なセクションだけを選択してロードする必要があります。
私がしたいのは、各セクションがオンデマンドでロードされるハイブリッドアプローチを実現することです。
しかし、これを行うと、ファイルシステムのハンドルを私が望む時間より長く開いたままにしておくことや、コードの複雑さが増えるという潜在的な欠点があります。
このような標準パターンはありますか?生のバイトとしてファイル全体をメモリにロードし、その後からアンロードセクションのすべての要求を満たす
- :私のオプションがしているようですディスクではなくメモリバッファ。これにより、不必要なセクションを解析するコストが節約されます(ディスク表現は、オブジェクトモデルよりもはるかにコンパクトであるため)必要なメモリが少なくなります。
- すぐに必要なセクションをロードしてファイルを閉じますが、ファイルのソースの場所を保持します。次に、別のセクションが要求された場合は、ファイルを再度開いてデータをロードします。この場合、基礎となるファイルが変更された場合、私は奇妙な結果を得ることができます。
- 上記と同じですが、ファイルハンドルを開いたままにします(おそらく読み取り共有を許可します)。
- Memory-Mapped IOを使用してファイルをロードし、ファイルのビューを開いたままにします。
任意の考え
*それを動かす*、私はそのトリックを知らなかった。私の好奇心を鎮めるためにいくつかの情報がありますか? :-) –
技術的には、既存のビューを移動することはできません。しかし、古いビューをマップ解除して、同じmmapの別のセクションに新しいビューを再マップすることができます。一度に同じmmapのマルチプルビューをアクティブにすることさえできます。この種の技術を使用して、マルチメガバイト(時にはマルチギガバイト)のログファイルのデータをスクロールします。非常にうまく、非常に迅速に動作します。 –