加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 创建realy巨大的scipy数组

发布时间:2020-12-20 13:38:07 所属栏目:Python 来源:网络整理
导读:我想从一个非常庞大的列表中创建一个scipy数组.但不幸的是我偶然发现了一个问题. 我有一个字符串列表xs.每个字符串的长度为1. type(xs)type 'list' len(xs)4001844816 如果我只转换前10个元素,一切仍然按预期工作. s = xs[0:10] x = scipy.array(s) xarray([
我想从一个非常庞大的列表中创建一个scipy数组.但不幸的是我偶然发现了一个问题.

我有一个字符串列表xs.每个字符串的长度为1.

>>> type(xs)
<type 'list'>
>>> len(xs)
4001844816

如果我只转换前10个元素,一切仍然按预期工作.

>>> s = xs[0:10]
>>> x = scipy.array(s)
>>> x
array(['A','B','C','D','E','F','O','O'],dtype='|S1‘)
>>> len(x)
10

对于整个列表,我得到了这个结果:

>>> ary = scipy.array(xs)
>>> ary.size
1
>>> ary.shape
()
>>> ary[0]
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
IndexError: 0-d arrays can't be indexed
>>>ary[()]
...The long list

解决方法是:

test = scipy.zeros(len(xs),dtype=(str,1))
for i in xrange(len(xs)):
    test[i] = xs[i]

这不是内存不足的问题.
到目前为止,我将使用解决方法(需要15分钟).但我想了解这个问题.

谢谢


编辑:
备注解决方法测试[:] = xs不起作用. (也失败了0-d IndexError)

在我的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).但是,适当的阵列大小可以创建30亿’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')


"""

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读