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

如何将PyTorch多维张量存储到磁盘并按偏移读取指定行数据

最优实现方案

针对你这个固定形状的二维PyTorch张量,核心需求是随机读取指定行、无需加载全量数据,最优方案是采用「二进制裸数组存储+内存映射读取」的组合,比存成pt、pickle等需要全量加载的格式效率高很多,对更大尺寸的张量也通用。

第一步:存储张量到磁盘

先处理张量去掉梯度和cuda设备属性,分别存储张量元数据(形状、数据类型)和二进制数组:

import numpy as np
import torch
import json

# 替换为你自己的张量变量名
raw_tensor = tensor
# 转移到CPU、去掉梯度后转numpy数组
np_arr = raw_tensor.detach().cpu().numpy()

# 存储元数据,文件很小不占空间
metadata = {"shape": np_arr.shape, "dtype": str(np_arr.dtype)}
with open("emb_meta.json", "w", encoding="utf-8") as f:
    json.dump(metadata, f)

# 存储二进制张量文件
np_arr.tofile("entity_emb.bin")

第二步:读取指定行到内存

用numpy的memmap做内存映射,仅加载你需要的行数据,不会读取全量张量:

import numpy as np
import torch
import json

# 先读元数据
with open("emb_meta.json", "r", encoding="utf-8") as f:
    metadata = json.load(f)

# 只读模式映射文件,这一步不会加载全量数据到内存
mem_map = np.memmap(
    "entity_emb.bin",
    dtype=metadata["dtype"],
    shape=tuple(metadata["shape"]),
    mode="r"
)

# 直接索引你需要的行即可,比如最后一行,这时候才会把对应行加载到内存
target_row = mem_map[-1]
# 需要转回PyTorch张量的话直接转即可
target_tensor = torch.from_numpy(target_row.copy())

# 用完删除映射释放资源
del mem_map

方案优势

  1. 内存占用极低:仅加载你需要的行数据,完全不需要把几MB甚至几GB的全量张量读进内存
  2. 读写速度快:没有额外的序列化/反序列化开销,比hdf5、pt等格式的随机读性能高很多
  3. 实现无额外依赖:不需要引入第三方库,用你已有的numpy、PyTorch环境就能运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:51:02