Python二进制数据读写问题:大尺寸数据集存储与读取报错排查
问题解决:Numpy二进制数据集读写报错排查与修复
场景背景
处理超大体积对比数据集(样本量n极大,受内存限制仅能以特定文本格式存储)时,采用numpy.array.tobytes()将数据转成二进制写入文件,但后续读取阶段,使用np.frombuffer等方法报错,尝试按行读取时触发ValueError: buffer is smaller than requested size。
核心问题及修复方案
数据格式不匹配:写入时采用
np.float64编码,但读取时误用"f"(对应float32)格式解析。
修复:读取时严格匹配写入的 dtype,比如写入用np.float64,读取就指定dtype=np.float64或对应格式符"d"。示例代码:# 写入逻辑 arr = np.array(data_chunk, dtype=np.float64) with open("dataset.bin", "ab") as f: f.write(arr.tobytes()) # 读取逻辑 with open("dataset.bin", "rb") as f: buffer = f.read() arr = np.frombuffer(buffer, dtype=np.float64)二进制文件未保留"\n"分隔的块结构:二进制流不识别文本换行符
\n,用文本行读取逻辑处理二进制文件会破坏数据结构,导致读取缓冲区大小不符合预期。
修复:放弃文本行读取逻辑,要么一次性读取完整缓冲区后按数据块大小拆分,要么写入时额外记录每个数据块的字节长度(先写块长度的二进制值,再写对应数据块)。示例代码:# 写入时记录块长度 with open("dataset.bin", "ab") as f: for chunk in data_chunks: arr = np.array(chunk, dtype=np.float64) # 先写入块字节数(用int32存储,占4字节) f.write(np.int32(arr.nbytes).tobytes()) # 再写入数据块 f.write(arr.tobytes()) # 读取时按长度拆分 with open("dataset.bin", "rb") as f: while True: len_buf = f.read(4) if not len_buf: break chunk_byte_len = np.frombuffer(len_buf, dtype=np.int32)[0] data_buf = f.read(chunk_byte_len) arr = np.frombuffer(data_buf, dtype=np.float64) # 处理当前数据块写入时额外添加"\n"拆分字节流:写入二进制数据时错误添加文本换行符
\n,导致字节流混入无关字节,读取时缓冲区包含冗余数据,无法匹配预期大小。
修复:写入二进制文件时仅输出arr.tobytes()生成的纯二进制数据,不添加任何文本格式分隔符;若需区分数据块,采用上述“先写块长度”的方式,而非文本换行符。
内容的提问来源于stack exchange,提问作者linkey apiacess
相关产品推荐
相关产品推荐

