如何在禁用pickle时向文件追加numpy complex128数据?
解决numpy complex128流式数据追加保存问题
方案1:使用原始二进制文件(最简洁方案)
- 追加写入时直接输出数组的原始字节,完全避开pickle相关问题:
import numpy as np # 追加写入complex128数据 def append_complex_data(file_path, data): with open(file_path, 'ab') as f: data.astype(np.complex128).tofile(f) # 读取完整数据 def load_complex_data(file_path): return np.fromfile(file_path, dtype=np.complex128) - 优势:读写速度快,无额外格式开销,适配流式场景;注意:读取时必须手动指定
dtype=np.complex128,文件本身不存储类型信息。
方案2:使用numpy内存映射文件(np.memmap)
- 利用内存映射直接操作磁盘数组,支持动态扩展长度:
import numpy as np # 初始化或追加数据 def append_memmap_data(file_path, data): try: # 获取现有数据长度 existing = np.memmap(file_path, dtype=np.complex128, mode='r') new_total_len = len(existing) + len(data) del existing except FileNotFoundError: new_total_len = len(data) # 创建可写映射并写入新数据 memmap_arr = np.memmap(file_path, dtype=np.complex128, mode='w+', shape=(new_total_len,)) memmap_arr[-len(data):] = data memmap_arr.flush() del memmap_arr # 读取数据(拷贝到内存) def load_memmap_data(file_path): return np.memmap(file_path, dtype=np.complex128, mode='r').copy() - 优势:保留numpy数组的结构信息,读取无需手动指定类型;注意:每次追加需要重新映射文件,适合中等规模的流式数据。
方案3:使用HDF5格式(适合复杂流式存储)
- 借助h5py库实现可扩展的数据集,支持同时存储元数据:
import h5py import numpy as np # 追加写入HDF5文件 def append_hdf5_data(file_path, data): with h5py.File(file_path, 'a') as f: if 'complex_sdr_data' not in f: # 创建可动态扩展的数据集 dset = f.create_dataset('complex_sdr_data', data=data, dtype=np.complex128, maxshape=(None,)) else: dset = f['complex_sdr_data'] # 扩展数据集长度并写入新数据 dset.resize(dset.shape[0] + len(data), axis=0) dset[-len(data):] = data # 读取完整数据 def load_hdf5_data(file_path): with h5py.File(file_path, 'r') as f: return np.array(f['complex_sdr_data']) - 优势:支持元数据存储,可灵活扩展,适合长期归档或复杂流式场景;注意:需要额外安装
h5py库(pip install h5py)。
内容的提问来源于stack exchange,提问作者Radika Moonesinghe
相关产品推荐
相关产品推荐

