有啥方法可以将 numpy 数组连接到内存之外(在磁盘上)?

Posted

技术标签:

【中文标题】有啥方法可以将 numpy 数组连接到内存之外(在磁盘上)?【英文标题】:Is there any way to concatenate numpy arrays out of memory (on disk)?有什么方法可以将 numpy 数组连接到内存之外(在磁盘上)? 【发布时间】:2017-10-14 20:51:35 【问题描述】:

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

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

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

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

有没有办法在磁盘上进行连接和切片,所以我不需要将整个矩阵放在内存中?

【问题讨论】:

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

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.]]

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

【讨论】:

以上是关于有啥方法可以将 numpy 数组连接到内存之外(在磁盘上)?的主要内容,如果未能解决你的问题,请参考以下文章

将 numpy 字符串数组连接到 numpy 数字数组

有啥方法可以将 Raspi 连接到用于 CD/CI 管道的 devops?

有啥方法可以将 Einstein 分析连接到一些 3rd 方 BI 应用程序,例如 powerbi?

有啥方法可以在不使用 XMPP 协议的情况下连接到 Facebook 聊天服务?

当连接变坏时,有啥方法可以让 JBoss 连接池重新连接到 Oracle?

有啥方法可以使用 TCP 隧道连接到像 Visual Fox pro 这样的文档数据库