是否存在可利用多核压缩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
相关产品推荐
相关产品推荐

