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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:25:14