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

Python中保存大型矩阵后读取遇MemoryError问题求助

解决NumPy读取大型矩阵时的MemoryError问题

问题描述

通过循环生成维度为(3324, 1, 24464)的NumPy矩阵bxx,使用numpy.savetxt保存为文本文件后,用numpy.loadtxt读取触发内存错误:

保存代码:

import numpy
my_matrix = bxx
numpy.savetxt('matrix.txt', my_matrix, delimiter = ',')

读取代码:

import numpy
my_matrix = numpy.loadtxt(open("matrix.txt","rb"),delimiter=",",skiprows=0)

报错信息:

Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_11628\2774506594.py in <module>
      6 #read file into a matrix
      7 import numpy
----> 8 my_matrix = numpy.loadtxt(open("matrix.txt","rb"),delimiter=",",skiprows=0)

~\Anaconda3\envs\myenv\lib\site-packages\numpy\lib\npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding, max_rows, like)
   1148         for x in read_data(_loadtxt_chunksize):
   1149             if X is None:
-> 1150                 X = np.array(x, dtype)
   1151             else:
   1152                 nshape = list(X.shape)

MemoryError: Unable to allocate 620. MiB for an array with shape (3324, 1, 24464) and data type float64

解决办法

1. 改用NumPy原生二进制格式读写

文本格式存储效率极低,读取时内存占用大,换成.npy原生二进制格式能大幅降低内存压力,同时读写速度更快:

# 保存
numpy.save('matrix.npy', bxx)

# 读取
my_matrix = numpy.load('matrix.npy')

.npy会自动保留数组的维度、数据类型等元信息,无需处理分隔符。

2. 降低数据类型精度

如果业务场景不需要float64的高精度,可将数组转成float32或float16,直接减少一半或四分之三的内存占用:

# 保存时转换类型
numpy.save('matrix_float32.npy', bxx.astype('float32'))

# 读取后为float32类型
my_matrix = numpy.load('matrix_float32.npy')

注意:转换前确认精度损失在可接受范围内。

3. 分块读取文本文件

若必须使用文本格式,可逐块读取数据,避免一次性加载全部内容到内存:

import numpy as np

# 自定义分块大小(根据可用内存调整)
chunk_size = 1000

# 获取文件总行数
with open('matrix.txt', 'r') as f:
    total_rows = sum(1 for _ in f)

# 逐块读取并拼接
chunks = []
for i in range(0, total_rows, chunk_size):
    chunk = np.loadtxt('matrix.txt', delimiter=',', skiprows=i, max_rows=chunk_size)
    chunks.append(chunk)

my_matrix = np.concatenate(chunks).reshape((3324, 1, 24464))

4. 使用内存映射文件

针对超大型数组,用numpy.memmap创建内存映射,数据存放在磁盘而非全部加载到内存,访问时按需读取:

# 先将数组保存为二进制文件
bxx.tofile('matrix.bin')

# 创建内存映射,指定数据类型和原数组形状
my_matrix = np.memmap('matrix.bin', dtype='float64', mode='r', shape=(3324, 1, 24464))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:32:51