現在、特定の配列 (ダイグラフ) 内のすべてのサイクルを列挙する関数を使用しており、それらすべてが必要です。この関数は、すべてのサイクルをリストのリストとして返します (各サブリストはサイクルです。たとえば、result=[[0,1,0],[0,1,2,0]] はノードで開始および終了する 2 つのサイクルを含むリストです) 0)。ただし、何百万ものサイクルがあるため、すべてのサイクルを含むリストのリストが大きすぎるため、大きな有向グラフではメモリ エラー (MemoryError: MemoryError()) が発生します。
関数が結果をいくつかの配列に分割して、メモリエラーが発生しないようにしたいと思います。それは可能ですか?それで問題は解決しますか?
結果配列をサブ結果のリストとして分割することで、これを実行しようとしました (サブ結果には最大サイズがあり、たとえば 1,000 万で、ここに記載されている 5 億の最大サイズを下回っています: How Big can a Python Array Get? ) . アイデアは、結果がサブ結果を含むリストであるということです: result=[sub-result1, sub-result2]. ただし、別のメモリ エラーが発生します。新しいパーサーのメモリがありません。
私がそれを行う方法は次のとおりです。
if SplitResult == False:
result = [] # list to accumulate the circuits found
# append cycles to the result list
if cycle_found(): #cycle_found() just for example
result.append(new_cycle)
elif SplitResult == True:
result = [[]] # list of lists to accumulate the circuits found
# append cycles to the LAST result SUB-lists
if cycle_found(): #cycle_found() just for example
result[len(result)-1].append(new_cycle)
# create a new sublist when the size of the LAST result SUB-lists
# reaches the size limit (ResultSize)
if len(result[len(result)-1]) == ResultSize:
result.append([])
おそらく問題は、結果リスト内のすべてのサブ結果をマージすることです。その場合、関数から可変数の結果を返すにはどうすればよいですか?
特に、12 ノードの完全な有向グラフのすべての単純なサイクルを 1000 万サイクルのサブリストに分割します。合計で 115,443,382 サイクルあることがわかっているので、16 のサブリストを含むリストを取得する必要があります。最初の 15 にはそれぞれ 1,000 万サイクルが含まれ、最後のリストには 443,382 サイクルが含まれます。その代わりに、別のメモリ エラーが発生します: no mem for new parser.
この手順は、1000 万サイクル (10000000) を含む最初のサブリストと 976184 を含むもう 1 つのサブリストを返す 11 ノードの完全なダイグラフに対して機能します。
>>> sys.getsizeof(cycles_list[0])
40764028
>>> sys.getsizeof(cycles_list[1])
4348732
次に、リストされている各サイクルのサイズを追加する必要があると思います。
>>> sys.getsizeof(cycles_list[0][4])
56
>>> cycles_list[0][4]
[0, 1, 2, 3, 4, 0]
どんな助けでも大歓迎です、
読んでくれてありがとう、
アレイクス