2009-03-14 14 views
3

私は木のような構造である多数のオブジェクトを持っています。アプリケーションのメモリ使用量が> 1GBに近づき、マシンのパフォーマンスが低下し、メモリ不足命令があることを意味するという問題があります。C#で大きなオブジェクトを管理する

私はsqliteを使ってオブジェクトをテーブルに配置し、データを効果的に管理することができましたが、これはもはや可能な解決策ではありません。

このようなことを管理するためのアドバイスはありますか? 私は使用する(実際の)データベースがないので、解決策は何とかsqliteプロシージャを模倣し、いくつかのファイルバックストレージを使用することになると考えています - 純粋なドットネットに既に存在するものがあるか、状況?

答えて

7

非常に多数のオブジェクトの格納を開始すると、オブジェクト割り当てのオーバーヘッドが大きな問題になります。たとえば、.NETを32ビットシステムで実行する場合、オブジェクトを割り当てるには最低16バイト必要です。 64ビットシステムでは、オブジェクトごとに最小24バイトの話があります。個々のオブジェクトが小さい場合、その割り当てオーバーヘッドは巨額の支払いコストです。

あなたは「ツリーのような構造」を持っていると言っています。アプリケーションの詳細がなければ、これは当てはまるとは言えませんが、ほとんどのツリー構造では子ノードへのポインタと親ノードへの(時には)ポインタが必要です。木ほど便利なので、時には非常に大きなオーバーヘッドが発生します。親と子のリンクがツリーで使用される総メモリの50%以上を必要とすることは珍しいことではありません。

C#では、構造体には基本的に割り当てオーバーヘッドがないため、オブジェクトではなく構造体を使用して割り当てオーバーヘッドを軽減できます。欠点は、もちろん、時には非常に不都合な値型セマンティクスに対処しなければならないことです。

多くのツリー構造を配列に折りたたんで、子リンクと親リンクを削除し、膨大なメモリを節約することも可能です。これは通常、より複雑なコードと実行時の効率の低下を犠牲にして行われます。

私の仕事では、定期的に非常に大きなコレクション(数億ノード)をメモリに保存しなければなりません。2億5,000万のレコードがメモリにある場合、ノードの4バイトごとに別の1ギガバイトのRAMが必要です。このようなデータ構造を維持するには、16ギガバイトのマシンでも、メモリの使用方法について非常に慎重な検討が必要です。

メモリ全体を保持する必要がある場合は、できる限りツリーノードの構造体を作成することをお勧めします。また、ツリーを格納する別の方法(親または子への明示的なリンクを排除する方法)を検討する必要があります。あなたの特定のアプリケーションについてさらに詳しい情報がなければ、私はより具体的な推奨をすることはできません。

+0

サードパーティ(私の会社:)によって設定された解決策に制限があります。動的に定義されたDataSetを作成し、GCを強制しました。ヒント/ヒントありがとう! –

1

賭けの明白な質問権: 1.なぜこのような大きな木構造を一度に保管する必要があるのですか? 2.このデータはどこから来ていますか?

これらの質問の回答が何であれ、すべてのデータを一度にすべてのメモリに保存する必要はありません。大量のデータをディスクに保存し、その時に必要なビットだけを読み込みます。それはあなたがとにかく行っていた方向のように見えます。 .NETにはRDMSのほかにデータを格納できる場所がたくさんあります。フラットファイル、XMLファイル、隔離されたストレージなど。あるいは、あなたは一度に小さなビットにそれを与えるために、あなたがこのデータ(質問#2)を与えているシステムを持っている可能性がありますか? 絶対に大きなツリー構造をメモリに格納する必要がある場合。いくつかの木構造アルゴリズム、あるいはデータ圧縮を研究していますか?

+0

データは、照会できないデータソースから取得されます。終了表示はツリー内の結果の数に依存するため、構造全体が保持されます。 –

0

SQL Server Expressは無料です。

+0

私はこれを使用することはできません:( –

+0

なぜ私は尋ねますか? –

+0

私のワークフローでは –

関連する問題