Python处理形状为(12238470,211)的大数据集内存错误解决方法
解决大内存数据集操作的MemoryError问题
1. 优化数据类型,压缩内存占用
Pandas默认会用高精度数据类型(如float64、int64),但多数场景下无需这么高的精度,手动转换为紧凑类型能大幅降低内存消耗:
- 数值列:将
float64转为float32;整数列根据值的范围,转为int32/int16/int8 - 字符串列:若列中重复值占比高,转为
category类型
示例代码:
def reduce_mem_usage(df): # 优化数值列 for col in df.columns: col_type = df[col].dtype if col_type != object: c_min, c_max = df[col].min(), df[col].max() # 处理整数类型 if str(col_type)[:3] == 'int': if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max: df[col] = df[col].astype(np.int8) elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max: df[col] = df[col].astype(np.int16) elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max: df[col] = df[col].astype(np.int32) # 处理浮点类型 else: if c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max: df[col] = df[col].astype(np.float32) # 优化字符串列 else: df[col] = df[col].astype('category') return df # 合并数据集后调用优化函数 df = reduce_mem_usage(df)
2. 分块读取处理,避免全量加载内存
不要一次性读取所有文件到内存,利用read_csv的chunksize参数分块读取,在分块阶段完成合并、NaN处理等操作:
import glob import pandas as pd folder_path = "Stress-Predict-Dataset-main" csv_files = glob.glob(f"{folder_path}/**/*.csv", recursive=True) chunk_size = 100000 # 根据自身内存调整块大小 combined_df = pd.DataFrame() for file in csv_files: # 分块读取单个CSV for chunk in pd.read_csv(file, chunksize=chunk_size): # 提前在块内处理NaN(删除或填充) chunk = chunk.dropna(subset=['关键列']) # 可指定列,避免全量删除 # 合并到总数据集 combined_df = pd.concat([combined_df, chunk], ignore_index=True)
3. 只加载需要的列
若无需分析全部211列,用usecols参数指定目标列,直接减少内存占用:
# 替换为你实际需要的列名 target_cols = ['心率', '压力值', '时间戳'] df_list = [pd.read_csv(file, usecols=target_cols) for file in csv_files] df = pd.concat(df_list, ignore_index=True)
4. 及时清理无用变量,释放内存
合并完成后,删除临时变量并手动触发垃圾回收:
import gc # 删除临时列表,释放内存 del df_list gc.collect() # 后续执行describe等操作 df.describe()
5. 用大数据工具替代Pandas
如果上述方法仍无法解决,可使用Dask——它支持内存外计算和并行处理,语法和Pandas高度兼容:
import dask.dataframe as dd folder_path = "Stress-Predict-Dataset-main" csv_files = glob.glob(f"{folder_path}/**/*.csv", recursive=True) # Dask读取所有CSV文件 ddf = dd.read_csv(csv_files) # 执行describe统计(compute()触发实际计算) desc_result = ddf.describe().compute() # 删除含NaN的行 clean_ddf = ddf.dropna()
内容的提问来源于stack exchange,提问作者Awais Raza
相关产品推荐
相关产品推荐

