numpy数组最快的保存和加载选项

发布于 2021-01-29 19:11:37

我有一个脚本,生成numpy array带有dtype=float和形状为的二维s (1e3, 1e6)。现在,我正在使用阵列np.savenp.load执行IO操作。但是,这些功能对于每个阵列都需要花费几秒钟。是否有更快的方法来保存和加载整个数组(即,无需假设其内容并减少它们)?我愿意array在保存之前将s转换为另一种类型,只要准确保留数据即可。

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对于真正的大型阵列,我听说过几种解决方案,它们大多是对I / O懒惰:

    • NumPy.memmap,将大数组映射为二进制形式
      • 优点:
      • 除Numpy外没有其他依赖项
      • 透明替换ndarray(任何接受ndarray的类都接受memmap
      • 缺点:
      • 您的阵列块限制为2.5G
      • 仍然受Numpy吞吐量限制
    • 将Python绑定用于HDF5(一种支持大数据的文件格式,如PyTablesh5py)

      • 优点:
      • 格式支持压缩,索引和其他超好功能
      • 显然,最终的PetaByte大文件格式
      • 缺点:
      • 学习曲线的层次结构?
      • 必须定义您的性能需求(请参阅下文)
      • Python的酸洗系统(出于种族,而不是为了速度而提及)

      • 优点:

      • 这是Pythonic!(哈哈)
      • 支持各种物体
      • 缺点:
      • 可能比其他对象慢(因为针对任何对象而不是数组)

    Numpy.memmap

    NumPy.memmap的文档中:

    创建到存储在磁盘上的二进制文件中的数组的内存映射。

    内存映射文件用于访问磁盘上大文件的小片段,而无需将整个文件读入内存

    memmap对象可以在接受ndarray的任何地方使用。给定任何memmap fpisinstance(fp, numpy.ndarray)
    返回True。


    HDF5阵列

    h5py文档

    使您可以存储大量的数值数据,并轻松地从NumPy处理该数据。例如,您可以将磁盘上存储的多TB数据集切片,就像它们是真实的NumPy数组一样。数千个数据集可以存储在一个文件中,可以根据需要进行分类和标记。

    该格式支持以各种方式压缩数据(为同一I / O读取加载更多位),但这意味着数据变得不那么容易单独查询,但在您的情况下(纯加载/转储数组),它可能会有效



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看