3

シナリオは次のとおりです。バイナリ シリアル化されたオブジェクトの 2 ~ 3 GB の大きなファイルがあり、各オブジェクトの ID とファイル内のオフセットを含むインデックス ファイルもあります。

指定された一連の ID をメモリにデシリアライズするメソッドを作成する必要があります。パフォーマンスは最も重要なベンチマークであり、メモリ要件を適切に保つことは 2 番目です。

MemoryMappedFile を使用するのが道のりのようですが、大きなファイルを処理する方法が少しわかりません。ファイルが非常に大きいため、ファイル全体の MemoryMappedViewAccessor を作成できません。メモリにあまり影響を与えずに、異なるセグメントのいくつかの MemoryMappedViewAccessor を同時に開いておくことはできますか? その場合、それらのセグメントの大きさはどのくらいですか?

データが頻繁にアクセスされてから破棄される場合、ビューはしばらくメモリに保持される可能性があります

おそらく単純な方法は、オブジェクトをオフセットでフェッチするように注文し、小さなバッファーを使用してオフセットごとに CreateViewAccessor を呼び出すだけです。別の方法は、必要な最小量の異なる MemoryMappedViewAccessor とそのサイズを見つけようとすることです..しかし、CreateViewAccessor を作成する際のオーバーヘッドと、一度に安全にアクセスできるスペースの量がわかりません。私はいくつかのテストを行うことができますが、誰かがより良いアイデアを持っている場合... :)

大きなデータファイルをいくつかに分割する別の方法があると思いますが、この場合、それがうまくいくかどうかはわかりません...

4

2 に答える 2

0

私の質問は、シリアル化されたオブジェクトの 3GB ファイルが 2 つあるのはなぜですか? これは常に、これをロードするパフォーマンスの問題になります。
このすべての情報を一度に処理する必要がありますか? 最善のアプローチは、必要なときに必要な要素を照会し、その時点でそれらを再構築するために使用する何らかのデータベースです。保存しているデータの種類とその使用方法について詳しく教えてください。あなたのデザインには少し手を加える必要があるように私には思えます。

于 2010-10-24T15:29:31.693 に答える
0

ファイルはどのようなストレージに保存されていますか? 通常のHDDまたはSSD?通常の hdd の場合、シーク時間を最小限に抑える必要があるため、アクセスをオフセットで並べ替える必要がある場合があります。

大規模なメモリ マップ セグメントを使用しても、RAM のコストはそれほど高くないと思います。ファイル自体でバックアップできるため、アドレス空間のみが必要です。したがって、使用される RAM のほとんどは OS キャッシュです。

I/O Completion Portsを使用した非同期 IO が最速だと聞いたことがありますが、まだ使用していません。

于 2010-10-24T14:43:47.477 に答える