2

我目前正在使用一个函数来枚举特定数组(有向图)中的所有循环,我需要它们。此函数将所有循环作为列表列表返回(每个子列表都是一个循环,例如 result=[[0,1,0],[0,1,2,0]] 是一个包含 2 个循环的列表,从节点开始和结束0)。但是,有数百万个循环,因此对于大有向图,我会遇到内存错误 (MemoryError: MemoryError()),因为包含所有循环的列表列表太大。

我希望该函数将结果拆分为几个数组,这样我就不会收到内存错误。那可能吗?那会解决问题吗?

我试图通过将结果数组拆分为子结果列表来做到这一点(子结果有一个最大大小,比如 1000 万,低于此处所述的 5 亿最大大小:Python 数组能获得多大?) . 这个想法是结果是一个包含子结果的列表: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 个包含 1000 万个周期,最后一个包含 443,382 个周期。相反,我得到了一个不同的内存错误:新解析器没有内存。

此过程适用于返回 2 个子列表的 11 节点完整有向图,第一个包含 1000 万个周期(10000000),另一个包含 976184。如果有任何帮助,它们的内存占用是

>>> 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]

任何帮助都将受到欢迎,

谢谢阅读,

阿莱克斯

4

1 回答 1

2

谢谢你的建议。实际上,在返回数组时避免内存问题的正确方法是避免创建如此大的结果数组。因此,生成器函数是前进的方向。

生成器函数在这里得到了很好的解释:“yield”关键字在 Python 中做了什么? 我只想补充一点,当您在其中添加产量时,普通函数将成为生成器函数。此外,如果您添加 return 语句,迭代的生成将在到达它时结束(某些生成器函数没有“return”,因此是无限的)。

尽管生成器的使用很简单,但我还是很难将原始函数转换为生成器函数,因为它是一个递归函数(即调用自身)。但是,此条目显示了递归生成器函数的外观帮助理解这个递归 python 函数是如何工作的?所以我可以将它应用到我的函数中。

再次感谢大家的支持,

阿莱克斯

于 2013-06-14T21:20:01.940 回答