如何解决mtrand.RandomState.choice中的内存错误?

时间:2014-09-02 15:34:00

标签: python

我正在尝试从1e5字符串中采样1e7项,但是会出现内存错误。从1e4字符串中抽取1e6项是很好的。我在64位机器上使用4GB RAM,并且不认为我应该在1e7达到任何内存限制。有什么想法吗?

$ python3
Python 3.3.3 (default, Nov 27 2013, 17:12:35) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> K = 100

适用于1e6:

>>> N = int(1e6)
>>> np.random.choice(["id%010d"%x for x in range(N//K)], N)
array(['id0000005473', 'id0000005694', 'id0000004115', ..., 'id0000006958',
       'id0000009972', 'id0000003009'], 
      dtype='<U12')

N = 1e7时出错:

>>> N = int(1e7)
>>> np.random.choice(["id%010d"%x for x in range(N//K)], N)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mtrand.pyx", line 1092, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:8229)
MemoryError
>>> 

我发现了这个问题,但它似乎是关于捕捉这样的错误而不是解决它。

Python not catching MemoryError

我对使用random.choice的解决方案或使用其他方法执行此操作感到满意。感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用生成器函数解决此问题:

def item():
    for i in xrange(N):
      yield "id%010d"%np.random.choice(N//K,1)

这样可以避免同时需要内存中的所有项目。