【问题标题】:What is the source of Python3 Memory error? And how to solve it?Python3内存错误的根源是什么?以及如何解决?
【发布时间】:2018-12-05 04:39:54
【问题描述】:

我想循环绘制 .csv 文件。通过在 Stack 中搜索,我找到了使用 plt.figure() 的解决方案。当我运行 2 个文件时,这确实解决了我的问题。但是当我尝试这 20 个文件时,它给了我 MEMORY ERROR。它运行到第 6 个文件,然后抛出错误。

我要导入的每个 .csv 文件的大小约为 (800,000~1mil) x 10。

失败的解决方案/调试/问题来源-

我知道当您导入大文件时,您可能会导致内存错误(再次来自 Stack 的信息)。但是在这里我一遍又一遍地将文件加载到同一个变量中。因此我没想到会出现内存错误,因为我没有为每个循环使用更多内存。

这不是由于单个文件,因为我成功地批量运行了程序 - (1,5),(5,10),(10,15),(15-20)。但我希望这一次发生。

我试图定义用于绘图的函数,希望能避免这个问题。但又遇到了同样的问题。

如果我可以在每个循环完成后刷新 Python 数据库(?我的意思是浏览器中的缓存),我想我可以避免这个问题。但是我怎样才能做到这一点呢?

提前致谢。

P.S - 如果我能以某种方式加速程序,那将是一个奖励。

这是程序

import numpy as np
import matplotlib.pyplot as plt

global n,data1
n = '/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/k(0.1)_NO-DM.csv'
data1 = np.genfromtxt(n,delimiter=',',dtype=None)

for k in range(0,20):
    a = '/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/k_(0.1)_%d.csv'%k
    data2 = np.genfromtxt(a,delimiter=',',dtype=None)
    plt.figure()
    diff = data1 - data2
    plt.plot(np.log10(data1[:,1]),np.absolute(diff[:,6]),label='|diff_d|')
    plt.xlabel('log(a)')
    plt.ylabel('|diff_d|')
    plt.legend()
    plt.title('q_d = %d '%data2[0,10])
    plt.savefig('/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/Fig/k_(0.1)_%d_diff.png'%k)

【问题讨论】:

  • 两种可能。一种是:del data2gc.collect(),只要不再需要 data2。另一个是给我们multiprocessing 一次处理一个数据文件。当 SubProcess 完成时,它的内存被释放。
  • @JohnAnderson 我尝试了第一个选项。它使问题延长了一点。但是经过几个循环之后,我再次面临同样的问题。我认为这可能是情节数据的。当它们甚至没有分配变量时,我该如何删除它们?我对多处理一无所知。但我会调查一下。谢谢。
  • 也许这会有所帮助。来自matplotlib documentationIf you are creating many figures, make sure you explicitly call “close” on the figures you are not using, because this will enable pylab to properly clean up the memory.
  • @JohnAnderson 是的,它运行得非常完美而且速度也很快。将此添加为答案。它也会帮助其他人。非常感谢。

标签: python python-3.x matplotlib memory


【解决方案1】:

Matplotlib documentation 说:

    If you are creating many figures, make sure you explicitly call “close”
on the figures you are not using, because this will enable pylab to properly
clean up the memory.

因此,如果您遇到内存问题,请在 for 循环的底部添加对 plt.close() 的调用。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2011-05-20
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多