2009-07-29 4 views
1

ファイル内の各セクションのオフセットと長さを示すヘッダー付きのセクションで実装されたカスタムファイルタイプがあります。オンデマンドでカスタムファイルを開く

現在のところ、ファイルとやりとりしたいときは、ファイル全体をロードして解析するか、必要なセクションだけを選択してロードする必要があります。

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

しかし、これを行うと、ファイルシステムのハンドルを私が望む時間より長く開いたままにしておくことや、コードの複雑さが増えるという潜在的な欠点があります。

このような標準パターンはありますか?生のバイトとしてファイル全体をメモリにロードし、その後からアンロードセクションのすべての要求を満たす

  • を無駄にするだけファイル全体をロードし、サイクル/メモリについてgrousing停止

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

    任意の考え

  • 答えて

    1

    可能な場合は、MMAP-INGの全ファイルは通常、あなたはランダム・アクセス・パターンを持っている場合を行うための最も簡単なものです。この方法では、OSにローディング/アンロードの問題を委任し、無料で1 & 2を持っています。

    非常に特殊なアクセスパターンがある場合は、fadvise()のようなものを使用することもできます(これはWin32相当のものではありません)。

    ファイルが2GBを超えている場合は、64ビットの方法、またはオンデマンドでファイルをmmap()することができます。

    1

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

    +0

    *それを動かす*、私はそのトリックを知らなかった。私の好奇心を鎮めるためにいくつかの情報がありますか? :-) –

    +0

    技術的には、既存のビューを移動することはできません。しかし、古いビューをマップ解除して、同じmmapの別のセクションに新しいビューを再マップすることができます。一度に同じmmapのマルチプルビューをアクティブにすることさえできます。この種の技術を使用して、マルチメガバイト(時にはマルチギガバイト)のログファイルのデータをスクロールします。非常にうまく、非常に迅速に動作します。 –

    関連する問題