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

3 投票
1 回答
3509 浏览
提问于 2025-04-19 10:10

我正在尝试从10万个字符串中抽取10000000个项目,但遇到了内存错误。抽取1000000个项目从10000个字符串中是没问题的。我使用的是一台64位的机器,内存有4GB,我觉得在抽取10000000个项目时不应该达到内存限制。有没有什么建议?

$ 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

抽取1000000个项目时运行正常:

>>> 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')

抽取10000000个项目时出错:

>>> 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没有捕获MemoryError

我希望能找到一个解决方案,仍然使用random.choice,或者用其他方法来实现。谢谢。

1 个回答

2

你可以通过使用生成器函数来解决这个问题:

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

这样做的好处是,不需要一次性把所有的项目都放在内存里。

撰写回答