Python 有没有办法将numpy阵列连接到内存之外(磁盘上)?

Python 有没有办法将numpy阵列连接到内存之外(磁盘上)?,python,arrays,python-2.7,numpy,memory,Python,Arrays,Python 2.7,Numpy,Memory,我有一个在Python 2.7中批量执行的进程,并生成大致如下大小的numpyfloat64数组: 维度A:12 维度B:2000 尺寸C:89 现在,它们在每个批次中进行处理,并通过一些统计分析进行浓缩。这是可管理的(12×2000×89×8字节/浮点=约17MB),但我想对我的整个数据集进行一些分析 我需要以某种方式将批次沿着维度B连接到至少1000000的大小,这意味着8.5GB,然后在维度C中拆分它们,分别分析每个AxB二维矩阵。(12x1000000对于维度C上的每个元素“只有”9

我有一个在Python 2.7中批量执行的进程,并生成大致如下大小的numpy
float64
数组:

  • 维度A:12
  • 维度B:2000
  • 尺寸C:89
现在,它们在每个批次中进行处理,并通过一些统计分析进行浓缩。这是可管理的(12×2000×89×8字节/浮点=约17MB),但我想对我的整个数据集进行一些分析

我需要以某种方式将批次沿着维度B连接到至少1000000的大小,这意味着8.5GB,然后在维度C中拆分它们,分别分析每个AxB二维矩阵。(12x1000000对于维度C上的每个元素“只有”96MB,这更易于管理。)但我的系统上没有那么多内存,可能需要达到2000000或4000000

有没有办法在磁盘上进行连接和切片,这样我就不需要把整个矩阵都存储在内存中了?

看起来它能帮上忙;我创建了一个概念证明:

import tables
import numpy as np
fh = tables.open_file('bigarray.h5', mode='w')
atom = tables.Float64Atom()
filters = tables.Filters(complevel=5, complib='zlib')
bigarray = fh.create_earray(fh.root, 'bigarray', atom, shape=(0,89,12), filters=filters)
chunksize = 2000
nchunks = 25
for k in xrange(nchunks):
    if k%10 == 0:
        print k
    x0 = np.arange(89,dtype=np.float64)
    y0 = np.arange(12,dtype=np.float64)
    z0 = np.arange(chunksize,dtype=np.float64)+k*chunksize
    x,z,y=np.meshgrid(x0,z0,y0)
    bigarray.append(x*y*z)
print "shape:", bigarray.shape
print bigarray[10000:10100,1,:]
fh.close()
打印为

0
10
20
shape: (50000, 89, 12)
[[      0.   10000.   20000. ...,   90000.  100000.  110000.]
 [      0.   10001.   20002. ...,   90009.  100010.  110011.]
 [      0.   10002.   20004. ...,   90018.  100020.  110022.]
 ..., 
 [      0.   10097.   20194. ...,   90873.  100970.  111067.]
 [      0.   10098.   20196. ...,   90882.  100980.  111078.]
 [      0.   10099.   20198. ...,   90891.  100990.  111089.]]

50000*89*12个元素在磁盘上占用62.4MB(使用压缩,每个元素占用1.17字节)。

您可以使用,但磁盘访问模式可能非常低效。(如果在内存中执行此操作,内存访问模式可能也会非常低效。)不要忘记“购买更多RAM”选项,这通常是非常合理的。我不记得这是否可行,但
h5py
提供了一个类似numpy的磁盘数据视图。您可能能够做到这一点…34GB RAM(+额外的保证金)支持4000000,但我的笔记本电脑“仅”允许最大16GB,这是在经过公司I/s部门后完成的:/nothanks@mgilson我想知道pytables是否能做到这一点