Jupyter Notebook内存分配失败求助:调内存上限仍无效
解决方案
1. 分块加载/处理数据
不要一次性将全量数据读入内存,采用分块方式逐步处理:
- 用Pandas读取文件时指定
chunksize参数,每次处理小块数据并直接写入结果文件,避免内存堆积:
import pandas as pd chunk_size = 1000 for chunk in pd.read_csv("your_data.csv", chunksize=chunk_size): # 对当前chunk执行预处理、划分训练/测试集等操作 chunk.to_csv("train_data.csv", mode="a", header=False)
- 若是Numpy数组,使用
np.memmap将数据存储在磁盘,按需加载部分数据:
import numpy as np # 创建内存映射数组,仅在需要时加载指定区域 mmap_array = np.memmap("data.npy", dtype="uint8", mode="r", shape=(22370, 389604)) partial_data = mmap_array[:1000, :] # 仅加载前1000行
2. 降低数据维度
- 特征降维:用PCA、互信息筛选等方法压缩特征数量,比如将389604维特征压缩到几百维:
from sklearn.decomposition import PCA pca = PCA(n_components=500) reduced_data = pca.fit_transform(your_partial_data)
- 稀疏矩阵存储:若数据中0值占比极高,改用Scipy的稀疏矩阵格式(如
csr_matrix),仅存储非零值:
from scipy.sparse import csr_matrix sparse_data = csr_matrix(your_original_array) # 稀疏矩阵可直接用于划分训练/测试集等后续操作
3. 优化数据类型
uint8已是最小的无符号整数类型,但如果部分特征仅包含0/1值,可转为bool类型进一步压缩:
# 将某一列转为bool类型 data[:, target_col_idx] = data[:, target_col_idx].astype(bool)
4. 修正Jupyter配置误解
你之前设置的c.NotebookApp.max_buffer_size是Jupyter的I/O缓冲区大小,并非Python进程的内存上限,所以该配置对解决内存错误无效。可以通过以下方式优化运行环境:
- 关闭系统中占用大量内存的无关程序,释放可用内存;
- 确保使用64位Python(32位Python最大仅支持约4GiB内存);
- 若在容器环境中运行,需调整容器的内存配额。
5. 使用大数据处理工具
如果数据规模远超单进程内存上限,改用Dask、Vaex等专门处理大数据的库,它们支持类似Pandas/Numpy的接口,后台自动分块处理:
import vaex df = vaex.open("your_data.hdf5") # 直接划分训练/测试集,无需加载全量数据 train_df, test_df = df.ml.train_test_split(test_size=0.2)
内容的提问来源于stack exchange,提问作者Kristen Wang
相关产品推荐
相关产品推荐

