为了账号安全,请及时绑定邮箱和手机立即绑定

python:提高性能和/或方法以避免内存错误创建,保存和删除变量变量

python:提高性能和/或方法以避免内存错误创建,保存和删除变量变量

HUH函数 2021-03-29 16:19:27
我一直在与给我一个内存错误的函数作斗争,并感谢您的支持(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


查看完整回答
反对 回复 2021-04-02
  • 2 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号