合并15个CSV生成大DataFrame后内存占用29GB,如何释放冗余内存?
解决大CSV合并后冗余内存无法释放的问题
问题根源
你当前的代码存在两个核心问题:
- 变量删除方式错误:
del [[df1, df2,...]]仅删除了临时创建的列表对象,并未删除df1到df15这些独立的DataFrame变量,它们仍在占用内存。 - 加载逻辑低效:一次性加载15个大DataFrame再合并,会瞬间占用大量冗余内存,加重内存压力。
分步解决方案
1. 修复当前内存释放操作
如果已经加载了所有15个DataFrame,用以下代码正确释放冗余内存:
import gc # 逐个删除每个DataFrame变量 del df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df14, df15 # 强制触发垃圾回收 gc.collect()
执行后冗余内存会被系统回收,内存占用将回落至仅保留total_df的水平。
2. 从根源优化合并逻辑(推荐)
下次处理时,不要一次性加载所有文件,改为逐文件加载并追加到总DataFrame,内存中始终只保留当前加载的单个文件和合并后的总数据:
import pandas as pd import gc # 初始化空的总DataFrame total_df = pd.DataFrame() # 遍历15个CSV文件 for file_num in range(1, 16): file_path = f"test{file_num}.csv" # 加载单个文件 temp_df = pd.read_csv(file_path) # 追加到总数据 total_df = pd.concat([total_df, temp_df], ignore_index=True) # 立即删除临时DataFrame并回收内存 del temp_df gc.collect()
这种方式能把内存峰值控制在单个文件+总数据的规模,避免一次性加载15个文件的内存过载。
3. 进一步压缩总数据内存(可选)
针对你的数据规模(百万行、千余列),通过优化数据类型可大幅降低内存占用,为后续PCA等操作预留空间:
# 浮点列转float32(精度足够的话,内存占用减半) float_cols = total_df.select_dtypes(include=['float64']).columns total_df[float_cols] = total_df[float_cols].astype('float32') # 整型列按需缩小类型(比如int64转int32/int16,根据数值范围判断) int_cols = total_df.select_dtypes(include=['int64']).columns total_df[int_cols] = total_df[int_cols].astype('int32') # 字符串列转category(如果重复值占比高,可大幅节省内存) str_cols = total_df.select_dtypes(include=['object']).columns total_df[str_cols] = total_df[str_cols].astype('category')
内容的提问来源于stack exchange,提问作者ta ling
相关产品推荐
相关产品推荐

