2012-01-23 29 views
1

パフォーマンスの最適化で32GBのグラフデータ(ノード、エッジなど)がメモリにロードされ、そこに保持されるようなプロジェクト(私はプロジェクトではない)に取り掛かりました。これは長時間実行されるサービスなので、データはサービスの存続期間中メモリ内に残ることを意味します。 Gen 2コレクションがCLRによってトリガーされると、パフォーマンスが低下する大きな休止がありますが、GCはGen 2をスキャンして到達可能なオブジェクトとしてすべてをマークします。パフォーマンスの問題を引き起こすGCの一時停止

私が知りたいのは、大量のデータをメモリに保存しなければならない管理対象アプリケーションで利用できる戦略があることです。 Gen 2コレクションの実行を阻止する最良の方法は何ですか?

+0

Gen 2を実行しないと、Gen 2にするオブジェクトがリークしますが、永遠に生き残られません。あなたのアプリケーションが何をするかによって、それは多くのオブジェクトになる可能性があります。 – delnan

+0

申し訳ありませんが、あなたは正しいです。そのような長い休止を防ぐことができる戦略はありますか?または、管理されたランタイムを使用してこの種のアプリケーションを実装するのは悪い考えですか? –

+0

@itadapterありがとうございます。私はもはやその会社で働いていませんが、それは最終的に私たちがやってしまったことです。つまり、管理されていない状態にマーシャリングすることです。そしてそうです、問題を解決しました。 –

答えて

1

あなたの実装では、GCをより使いやすくするためにいくつか一般的なことがあります。比較的簡単なのは、オブジェクトグラフのオブジェクト参照の数を減らすことです。たとえば、交換してください:

class Graph { 
    List<Node> roots; 
    Node[] allNodes; 
    // ... 
} 

class Node { 
    int[] outwardEdges; 
    // ... 
} 

やデザインに合う何か似:ノード識別子を通じて間接参照して

class Graph { 
    List<Node> roots; 
    // ... 
} 

class Node { 
    Node[] outwardEdges; 
    // ... 
} 

を。これにより、コレクタが歩行する必要のあるオブジェクトグラフ内のポインタの数が減少します。

ネイティブヒープにデータをシフトすることは、必要な操作を実行するためのインターフェイスを提供するために、小さなJNIライブラリを作成することによっても可能です。これは他の方法で恩恵を受けることができます。私が解決するために同様の問題を抱えた最後の時に、UTF8としてコード化されたスペースがはるかに少ないデータセットに西側のテキストデータがほとんど存在したため、グラフ検索のコストが重要でない限り、ネイティブコールのオーバーヘッドは問題ではありません。

関連する問題