创建非常巨大的凌乱阵列

2024-10-04 11:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个非常大的列表中创建一个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分钟)。但我想了解这个问题。在

谢谢你

在-- 编辑: 解决方法的备注{}将不起作用。(也因0-d索引器错误而失败)

在我的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'

Tags: 方法字符串test列表lenversiontypescipy
1条回答
网友
1楼 · 发布于 2024-10-04 11:25:27

假设您有64位的OS/Python/Numpy,那么可能会出现内存不足的情况,这有时是不寻常的。第一个列表是4GB,然后为numpy阵列分配了额外的4GB。即使对于x64,这些都是大阵列。你以前见过memmap数组吗?在

下面我所做的是创建一系列memmap数组,显示(对于我的机器)断点在哪里(主要是磁盘IO)。但是,可以创建300亿个“S1”元素。这段代码可以帮助您查看memmap数组是否可以为您的问题提供一些好处。他们很容易相处。使用memmap数组可以加快15分钟的工作时间。在

baseNumber = 3000000L
#dataType = 'float64'#
numBytes = 1
dataType = 'S1'
for powers in arange(1,7):
  l1 = baseNumber*10**powers
  print('working with %d elements'%(l1))
  print('number bytes required %f GB'%(l1*numBytes/1e9))
  try:
    fp = numpy.memmap('testa.map',dtype=dataType, mode='w+',shape=(1,l1))
    #works 
    print('works')
    del fp
  except Exception as e:
    print(repr(e))


"""
working with 30000000 elements
number bytes required 0.030000 GB
works
working with 300000000 elements
number bytes required 0.300000 GB
works
working with 3000000000 elements
number bytes required 3.000000 GB
works
working with 30000000000 elements
number bytes required 30.000000 GB
works
working with 300000000000 elements
number bytes required 300.000000 GB
IOError(28, 'No space left on device')
working with 3000000000000 elements
number bytes required 3000.000000 GB
IOError(28, 'No space left on device')


"""

相关问题 更多 >