You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可利用多核压缩NumPy数组的方案?

多核心压缩保存大型NumPy数组的简便方案

下面是几个无需手动拆分数组、自动利用多核心的替代方案:

1. 使用Zarr库

Zarr专为大型多维数组设计,原生支持并行压缩,无需手动处理分块或多进程逻辑。

  • 安装依赖:pip install zarr
  • 示例代码:
import zarr
import numpy as np

# 假设你的4D数组是large_4d_array
large_4d_array = np.random.rand(1000, 1000, 10, 10)

# 配置多线程压缩(nthreads=-1表示使用全部核心)
compressor = zarr.Blosc(
    cname='zstd',  # 可选压缩算法:zstd、lz4、blosclz等
    clevel=3,      # 压缩级别,1-9
    shuffle=zarr.Blosc.SHUFFLE,
    nthreads=-1
)

# 保存数组
zarr.save('compressed_array.zarr', large_4d_array, compressor=compressor)

# 读取时直接加载
loaded_array = zarr.load('compressed_array.zarr')

2. 使用Dask Array

Dask会自动将大型数组拆分为块并并行处理,压缩保存过程无需手动干预。

  • 安装依赖:pip install dask
  • 示例代码:
import dask.array as da
import numpy as np

large_4d_array = np.random.rand(1000, 1000, 10, 10)

# 将NumPy数组转为Dask数组,自动分块
dask_array = da.from_array(large_4d_array, chunks='auto')

# 并行压缩保存(默认利用多核心)
da.to_zarr(dask_array, 'dask_compressed.zarr', compression='zstd', compression_opts={'level':3, 'threads':-1})

# 读取方式
loaded_dask_array = da.from_zarr('dask_compressed.zarr')
# 转为NumPy数组(如果内存足够)
loaded_array = loaded_dask_array.compute()

3. 使用HDF5 + Blosc并行压缩

借助h5py和Blosc压缩插件,实现多核心压缩写入HDF5文件。

  • 安装依赖:pip install h5py blosc
  • 示例代码:
import h5py
import numpy as np
import blosc

large_4d_array = np.random.rand(1000, 1000, 10, 10)

# 启用Blosc多线程压缩
blosc.set_nthreads(-1)

with h5py.File('compressed_array.h5', 'w') as f:
    # 创建数据集并指定压缩参数
    dset = f.create_dataset(
        'data',
        data=large_4d_array,
        compression='blosc',
        compression_opts={
            'clevel': 3,
            'shuffle': blosc.SHUFFLE,
            'cname': 'zstd'
        }
    )

# 读取数据
with h5py.File('compressed_array.h5', 'r') as f:
    loaded_array = f['data'][:]

内容的提问来源于stack exchange,提问作者Paul Jurczak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:37:43