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

标签 python arrays performance numpy io

我有一个脚本可以生成二维 numpy 数组,其中 dtype=float 和形状按 (1e3, 1e6) 的顺序排列.现在我正在使用 np.savenp.load 对数组执行 IO 操作。但是,每个数组的这些函数需要几秒钟。是否有更快的方法来保存和加载整个数组(即,不对它们的内容进行假设并减少它们)?只要数据完全保留,我愿意在保存之前将数组转换为另一种类型。

最佳答案

对于非常大的数组,我听说过几种解决方案,它们主要是关于 I/O 的懒惰:

  • NumPy.memmap , 将大数组映射为二进制形式
    • 优点:
      • 除了 Numpy 没有其他依赖
      • ndarray 的透明替换(任何接受 ndarray 的类都接受 memmap)
    • 缺点:
      • 您的阵列 block 限制为 2.5G
      • 仍然受到 Numpy 吞吐量的限制
  • 对 HDF5 使用 Python 绑定(bind),这是一种大数据就绪的文件格式,例如 PyTablesh5py

    • 优点:
      • 格式支持压缩、索引和其他超棒的功能
      • 显然是终极的 PetaByte 大文件格式
    • 缺点:
      • 分层格式的学习曲线?
      • 必须定义您的性能需求(见下文)
  • Python's pickling系统(出于对 Pythonicity 而不是速度的考虑)

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

Numpy.memmap

来自 NumPy.memmap 的文档:

Create a memory-map to an array stored in a binary file on disk.

Memory-mapped files are used for accessing small segments of large files on disk, without reading the entire file into memory

The memmap object can be used anywhere an ndarray is accepted. Given any memmap fp , isinstance(fp, numpy.ndarray) returns True.


HDF5 阵列

来自 h5py doc

Lets you store huge amounts of numerical data, and easily manipulate that data from NumPy. For example, you can slice into multi-terabyte datasets stored on disk, as if they were real NumPy arrays. Thousands of datasets can be stored in a single file, categorized and tagged however you want.

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

关于python - numpy 数组的最快保存和加载选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30329726/

相关文章:

python - 如何在python中同时插入多个输入?

python - sqlalchemy 外键关系属性

c# - 计算多维数组特定维度的项目(C#)

java - 为什么我的多线程效率不高?

Java 方法定义显着降低了执行速度

mysql - SQL |获取产品和产品变体

python - 使用 Beautifulsoup 抓取多个网站

c++ - Cython/C++ - 共享 PXD 文件中的头文件路径

java - 如何在动态属性 @Value 中注入(inject)参数

c - 分配动态结构数组