我有一个在批处理中使用multiprocessing在Python 2.7中执行的进程,并生成大致具有以下大小的numpy float64
数组:
现在,它们在每批中进行处理,并通过一些统计分析进行浓缩。这是可管理的(12×2000×89×8字节/浮点数=约17MB)但我想对我的整个数据集做一些分析。
我需要以某种方式将沿着维B的批次连接到至少1000000的大小,这意味着8.5GB,然后在维C之间将它们分开以分别分析每个AxB二维矩阵。 (12x1000000对于沿着维度C的每个元素“仅”为96MB,并且更易于管理。)但是我的系统上没有那么多内存,并且可能需要转到2000000或4000000。
有没有办法在磁盘上进行连接和切片,所以我不需要将整个矩阵放在内存中?
答案 0 :(得分:0)
Pytables EArray看起来可以提供帮助;我创建了一个概念证明:
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.]]
在磁盘上占用62.4MB,用于50000 * 89 * 12个元素(每个元素使用压缩1.17个字节)。