numpy数组最快的保存和加载选项
我有一个脚本,生成numpy
array
带有dtype=float
和形状为的二维s (1e3,
1e6)
。现在,我正在使用阵列np.save
并np.load
执行IO操作。但是,这些功能对于每个阵列都需要花费几秒钟。是否有更快的方法来保存和加载整个数组(即,无需假设其内容并减少它们)?我愿意array
在保存之前将s转换为另一种类型,只要准确保留数据即可。
-
对于真正的大型阵列,我听说过几种解决方案,它们大多是对I / O懒惰:
- NumPy.memmap,将大数组映射为二进制形式
- 优点:
- 除Numpy外没有其他依赖项
- 透明替换
ndarray
(任何接受ndarray的类都接受memmap
) - 缺点:
- 您的阵列块限制为2.5G
- 仍然受Numpy吞吐量限制
-
将Python绑定用于HDF5(一种支持大数据的文件格式,如PyTables或h5py)
- 优点:
- 格式支持压缩,索引和其他超好功能
- 显然,最终的PetaByte大文件格式
- 缺点:
- 学习曲线的层次结构?
- 必须定义您的性能需求(请参阅下文)
-
Python的酸洗系统(出于种族,而不是为了速度而提及)
-
优点:
- 这是Pythonic!(哈哈)
- 支持各种物体
- 缺点:
- 可能比其他对象慢(因为针对任何对象而不是数组)
Numpy.memmap
从NumPy.memmap的文档中:
创建到存储在磁盘上的二进制文件中的数组的内存映射。
内存映射文件用于访问磁盘上大文件的小片段,而无需将整个文件读入内存
memmap对象可以在接受ndarray的任何地方使用。给定任何memmap
fp
,isinstance(fp, numpy.ndarray)
返回True。
HDF5阵列
使您可以存储大量的数值数据,并轻松地从NumPy处理该数据。例如,您可以将磁盘上存储的多TB数据集切片,就像它们是真实的NumPy数组一样。数千个数据集可以存储在一个文件中,可以根据需要进行分类和标记。
该格式支持以各种方式压缩数据(为同一I / O读取加载更多位),但这意味着数据变得不那么容易单独查询,但在您的情况下(纯加载/转储数组),它可能会有效
- NumPy.memmap,将大数组映射为二进制形式