我想从一个非常大的列表中创建一个scipy数组。但不幸的是我偶然发现了一个问题。在
我有一个字符串列表。每个字符串的长度为1。在
>>> type(xs)
<type 'list'>
>>> len(xs)
4001844816
如果我只转换第一个10元素,那么一切仍按预期工作。在
^{pr2}$对于整个列表,我得到的结果是:
^{3}$解决方法是:
test = scipy.zeros(len(xs), dtype=(str, 1))
for i in xrange(len(xs)):
test[i] = xs[i]
这不是内存不足的问题。 到目前为止,我将使用变通方法(需要15分钟)。但我想了解这个问题。在
谢谢你
在--
编辑:
解决方法的备注{
在我的macbook上,2147483648是导致问题的最小尺寸。 我用这个小字体决定了:
#!/usr/bin/python
import scipy as sp
startlen = 2147844816
xs = ["A"] * startlen
ary = sp.array(xs)
while ary.shape == ():
print "bad", len(xs)
xs.pop()
ary = sp.array(xs)
print "good", len(xs)
print ary.shape, ary[0:10]
print "DONE."
这就是输出
...
bad 2147483649
bad 2147483648
good 2147483647
(2147483647,) ['A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A']
DONE.
python版本是
>>> sys.version
'2.7.5 (default, Aug 25 2013, 00:04:04) \n[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]'
>>> scipy.version.version
'0.11.0'
假设您有64位的OS/Python/Numpy,那么可能会出现内存不足的情况,这有时是不寻常的。第一个列表是4GB,然后为numpy阵列分配了额外的4GB。即使对于x64,这些都是大阵列。你以前见过memmap数组吗?在
下面我所做的是创建一系列memmap数组,显示(对于我的机器)断点在哪里(主要是磁盘IO)。但是,可以创建300亿个“S1”元素。这段代码可以帮助您查看memmap数组是否可以为您的问题提供一些好处。他们很容易相处。使用memmap数组可以加快15分钟的工作时间。在
相关问题 更多 >
编程相关推荐