我一直在与给我一个内存错误的函数作斗争,并感谢您的支持(Python:如何从函数中拆分并返回列表以避免内存错误),我设法解决了该问题;但是,由于我不是专业程序员,所以我想请您对我的方法以及如何提高其性能(如果可能)发表意见。该函数是一个生成器函数,它从n个节点的有向图返回所有循环。但是,对于12个节点有向图,大约有1.15亿个循环(每个循环定义为节点列表,例如[0,1,2,0]是一个循环)。我需要所有可用于进一步处理的循环,即使在它们初次生成时已经提取了它们的某些属性之后,也需要将它们存储在某个位置。因此,我们的想法是每1000万个周期削减结果数组以避免内存错误(当数组太大时,python用尽RAM)并创建一个新数组来存储以下结果。在12个节点的有向图中,我将拥有12个结果数组,11个完整的数组(每个数组包含1000万个循环),最后一个包含500万个周期。但是,仅拆分结果数组是不够的,因为变量保留在RAM中。因此,我仍然需要将每个磁盘写入磁盘,然后将其删除以清除RAM。如我如何创建可变数量的变量中所述。,使用'exec'创建变量变量名不是很“干净”,字典解决方案更好。但是,就我而言,如果将结果存储在单个字典中,由于数组的大小,它将耗尽内存。因此,我选择了“执行”方式。如果您能对此决定发表评论,我将不胜感激。另外,要存储数组,我使用numpy.savez_compressed,它为每个1000万循环数组提供了43 Mb文件。如果未压缩,则会创建一个500 Mb的文件。但是,使用压缩版本会减慢写入过程。知道如何加快写入和/或压缩过程吗?我编写的代码的简化版本如下:nbr_result_arrays=0result_array_0=[]result_lenght=10000000tmp=result_array_0 # I use tmp to avoid using exec within the for loop (exec slows down code execution) for cycle in generator: tmp.append(cycle) if len(tmp) == result_lenght: exec 'np.savez_compressed(\'results_' +str(nbr_result_arrays)+ '\', tmp)' exec 'del result_array_'+str(nbr_result_arrays) nbr_result_arrays+=1 exec 'result_array_'+str(nbr_result_arrays)+'=[]' exec 'tmp=result_array_'+str(nbr_result_arrays)
2 回答

泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
使用itertools.islice怎么样?
import itertools
import numpy as np
for i in itertools.count():
tmp = list(itertools.islice(generator, 10000000))
if not tmp:
break
np.savez_compressed('results_{}'.format(i), tmp)
del tmp
添加回答
举报
0/150
提交
取消