有什么方法可以将numpy数组串接出内存(在磁盘上)?

2024-09-28 22:13:15 发布

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

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

  • 尺寸A:12
  • 尺寸B:2000
  • 尺寸C:89

现在,它们在每批产品中进行处理,并通过一些统计分析进行浓缩。这是可以管理的(12×2000×89×8字节/浮点=大约17MB),但我想对我的整个数据集做一些分析。在

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

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


Tags: 数据内存numpy字节进程产品尺寸方式
1条回答
网友
1楼 · 发布于 2024-09-28 22:13:15

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()

打印出来的是

^{pr2}$

磁盘空间为62.4MB,用于50000*89*12个元素(使用压缩时每个元素1.17字节)。在

相关问题 更多 >