【问题标题】:Python Memory error calling execPython内存错误调用exec
【发布时间】:2014-06-18 06:59:38
【问题描述】:

我是 python 新手,下面是我的代码,

import numpy as np 

val = 4**10
Q = []
for j in range(60):
    a = []
    for i in range(val):
        tmp = (i+j)**2
        a.append(tmp)
    Q.append(a)
T= zip(*Q)
G = []
for t in T:
    tmps2 = np.average(t)
    G.append(tmps2)

以下是我的代码错误:

MemoryError                               Traceback (most recent call last)
C:\Python27\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glo
b, loc)
    169             else:
    170                 filename = fname
--> 171             exec compile(scripttext, filename, 'exec') in glob, loc
    172     else:
    173         def execfile(fname, *where):

C:\Users\User\Desktop\simpl.py in <module>()
     13
     14
---> 15 T= zip(*Q)
     16
     17 G = []

MemoryError:

所以,哪位专家能给我解释一下,我的电脑还有大约 1.5GB 的可用内存。

【问题讨论】:

    标签: python arrays memory numpy


    【解决方案1】:

    您可以通过以下方式更有效地实现这一目标:

    i,j= np.indices((60, 4**10))
    Q = (i+j)**2
    G = np.average(Q, axis=0)   
    

    最大的优点是:

    • 避免使用 for 循环
    • 内存使用效率更高。

    在这个例子中,Q 的转置没有被使用,所以你可能不会得到内存错误。

    【讨论】:

    • i, j = np.meshgrid(np.arange(60), np.arange(4**10), indexing='ij', sparse=True) 相当于 np.indices 并节省了一点内存
    • 亲爱的 Saullo 和 jtaylor, 感谢您的建议,它解决了我的问题。我可以知道,为什么在我的代码中它会耗尽内存,但使用 np.indices 或 np,meshgrid 不会有这样的问题。另外,我的电脑还有大约 1.5GB 的可用内存。 (我使用的是 Windows 8.1,python 2.7.6)。谢谢。
    • @user3751276 您的代码的问题在于它使用列表来存储大矩阵。列表中的每个元素的长度可能超过 64 位,而使用索引您将获得每个存储元素的 32 位。在您的版本中,您存储转置的 Q 矩阵,复制所需的空间。 1.5GB 的内存可能不足以存储所有这些。您使用的是 Python 2.7.6 64 位吗?
    • 亲爱的 Saullo,我使用 Python 2.7.6 32 位。衷心感谢您的意见和建议。谢谢。
    • @user3751276 如果您使用 Python 64 位,则不会出现内存错误,因为 32 位版本限制为大约 2GB 内存使用量,即使您的机器有更多可用...
    猜你喜欢
    • 2013-11-29
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2013-12-04
    • 2012-10-31
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多