7

私はIListとして実装された巨大な時系列で時系列的に操作を実行する必要があります。データは最終的にデータベースに格納されますが、データベースには何千万ものクエリを提出することは意味がありません。メモリマップされたファイル "メモリ内の"大きなデータセットを格納するためのIList実装?

現在、メモリ内のIListは、800万(小)以上のオブジェクトを格納しようとするとOutOfMemory例外をトリガしますが、何千万もの処理が必要です。

いくつかの調査の末、ディスクにデータを格納してIListラッパーを使用してデータにアクセスするのが最善の方法です。

Memory-mapped files(.NET 4.0で導入されました)は適切なインターフェイスのようですが、IList(簡単なアクセス用)を実装し、メモリマップファイルを内部的に処理するクラスを作成する最善の方法は何ですか?

他の方法について知っている場合は、私も興味があります。私は、db4oからのデータを使用してIListラッパーを考えました(、メモリマップファイルをIoAdapterFileとして使用していますが、おそらくdb4oを使用するとメモリマップファイルと直接対比してパフォーマンスが向上します)。

私はthis questionに尋ねました2009年に尋ねましたが、それは有用な答えや深刻なアイデアをもたらしませんでした。

+0

に部分だけをマッピングするために、「スライディングウィンドウ」のいくつかの並べ替えを使用する以外さメモリマップトファイルと固定構造のサイズオフセットを介して(アレイ状のアクセスを使用する)が、物理メモリが限界であることに注意してくださいシーケンシャルに実行する操作は?またはデータ全体を一度に操作していますか? – Yahia

+0

アクセスはシーケンシャル(更新を実行するためにコレクションを繰り返す)でなければなりません。また、遠端のオブジェクトを削除/削除する必要があります。 –

+2

データベースはこの仕事に適したツールです。データベースの呼び出しが多すぎないように、バッチでデータを更新します。物事を少し速くするためにmap-reduceスタイルの処理に興味があるかもしれません。 – dtb

答えて

8

このコードはPersistentDictionary<>ですが、文字列のみで動作し、ソースコードを読むと非常に大きなデータセット用に設計されているかどうかわかりません。

ESENT PersistentDictionary<>は、Windows(XP +)に存在するESENTデータベースエンジンを使用し、シンプルタイプを含むすべてのシリアライズ可能オブジェクトを格納することができます(最大16 TB)。

Disk Based Data Structures, including Dictionary, List and Array with an "intelligent" serializer私が探していたものと全く同じように見えましたが、特に「ネイティブ」.NET MemoryMappedFilesをまだ使用していないため、非常に大きなデータセットではうまく動作しませんでした。 。

更新1:.NET MemoryMappedFilesを大量に使用する独自のバージョンを実装しました。それは非常に高速ですし、一般的な用途であればCodeplexでそれをリリースする予定です。

更新2TeaFiles.Netも私の目的にはうまくいきました。強くお勧めします(無料)。

+0

あなたの経験を共有していただき、ありがとうございます。私は同じ問題を抱えています。あなたがすでにCodeplexに実装を投稿したかどうかは疑問でした。ありがとうございました。 – alhazen

+0

こんにちは、まだ。私が現在持っている1つの制約は、格納されるすべてのオブジェクトが値型である必要があるということです。これが当てはまる場合(または参照タイプから値タイプへの移行が可能な場合)、Codeplexに転記する前に自分のコードを共有することができます。 –

+0

@ErwinMayerあなたはどこかでコードを共有したのだろうかと思います。私はいくつかの大きなオブジェクトのためのIListの実装ファイルが必要です。 –

1

メモリマップされたファイルは、それを行うための素晴らしい方法です。しかし、ランダムに物事にアクセスする必要がある場合、非常に遅くなるでしょう。

おそらくメモリに保存したときに固定構造体サイズが出てくる可能性があります(可能な場合)。オフセットをリストアイテムIDとして使用します。しかし、削除/並べ替えは常に問題です。

+0

AFAIK、私たちはバイトオフセットを知っているので、ランダムアクセスはO(1)でなければなりません。 –

3

私はいくつかのオプションを参照しない:例えばSQLiteのは、この方法を使用することができます

  • 「インメモリDB」
    を - などのいずれかのセットアップは必要ちょうど一緒にDLLの展開(1または2)アプリケーションと残りの部分はプログラムで行うことができます
  • すべてのデータをDBに一時的なテーブルにロードしますが、データ量は不明ですが大量のデータがありますが、これは非常に高速です(処理は通常行うことができますデータベース内部でさえより良いです!)
  • もしメモリ
関連する問題