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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:01