非常に大きなツリーのような構造を同時に生成してトラバースする必要があるチェスのようなプログラムのバリアントを作成しています。各ノードには、10 個の bool、int、8 個の ulong、short[64]、および 2 個の ulong[64] があります。ルート ノードはいくつかの初期パラメーターを受け取り、そこから有効な子ノードがプログラムによって (再帰的に) 決定されます。
基本的に、私のプログラムはこのツリーを継続的に成長させ、ユーザーとプログラムは交互に子ノードから子ノードへとトラバースします。新しい子ノードが「選択」されるたびに、その親ノードと兄弟ノードは不要になり、破棄されます。ツリーが (最初のルート ノードから) 約 60 の深さに (平均で) 達すると、有効な子ノードの数は自然に減少し始め、深さが約 75 になるまで、ツリーは 1 つの最終ノードに解決されます。さらに子供たち。
この背後にあるロジックは、最初はかなり単純明快に見えましたが、私は常に OutOfMemoryException にぶつかり、それ以上の進行を完全に止めています。
以下は、「世代」ごとの有効な子供の平均です。
Generation New Nodes
1 1
2 20
3 4,000
4 30,000
5 2,200,000
6 > 50,000,000
私の実際のプログラムでは、第 5 世代を完全に展開することさえできません。ノード固有のデータを永続化しない場合 (自分の子ノードを特定するために使用されたノードのデータをクリアします)、第 5 世代を完全に拡張できますが、第 6 世代の途中で非常に堅固な壁にぶつかります。
理想的には、プログラムが最終的に到達し、「現在の」ノードの後の 8 世代のノードを維持することを望みます。これを見れば見るほど、その可能性は低いように思えます。
これを sqlite データベースで実行するのは疲れましたが、ツリーを十分に速く成長させることができませんでした。
非常に大きなツリー構造を処理するための潜在的な代替手段を知っている人はいますか?