【发布时间】:2016-01-27 16:15:55
【问题描述】:
我经常处理大量数据(数 GB 的数量级),这些数据以 NumPy 数组的形式存储在内存中。通常,我会处理此类 NumPy 数组的嵌套列表/元组。我应该如何将这些存储到磁盘?我想保留数据的列表/元组结构,必须压缩数据以节省磁盘空间,并且需要快速保存/加载。
(我现在面临的特定用例是一个包含 4000 个元素的长列表,由 2 元组 x 组成,其中 x[0].shape = (201,) 和 x[1].shape = (201,1000)。)
我尝试了几种选择,但都有缺点:
pickle存储到gzip存档中。这很好用,并且可以使用可接受的磁盘空间,但速度极慢,并且在节省时会消耗大量内存。numpy.savez_compressed。比pickle快得多,但不幸的是,它只允许使用一系列 numpy 数组(不是我所拥有的嵌套元组/列表)或指定参数的字典式方式。通过
h5py存储到 HDF5。这对于我相对简单的需求来说似乎太麻烦了。更重要的是,我对此进行了很多研究,而且似乎没有一种直接的方式来存储异构(嵌套)列表。hickle似乎完全符合我的要求,但不幸的是,它目前与 Python 3 不兼容(这是我正在使用的)。
我正在考虑围绕numpy.savez_compressed 编写一个包装器,它将确定数据的嵌套结构,将此结构存储在某个变量nest_structure 中,展平整个图形,并存储nest_structure 和所有展平的数据使用numpy.savez_compressed。然后,numpy.load 周围的相应包装器将理解nest_structure 变量,并重新创建图形并返回它。但是,我希望已经有类似的东西了。
【问题讨论】:
-
你用的是什么版本的python?
cPickle存在于 python 2 中,并且比pickle快得多。 -
@Dunes Python 3,其中默认的
pickle实现与Python 2的cPickle相同。
标签: python arrays numpy serialization storage