Python使用pandas分块读1GB以上|分隔txt文件内存报错如何解决
问题原因
- 核心bug是全局变量
mylist没有在每次调用chunk_read时重置,每次读取新文件都会把之前所有文件的块再次追加到列表中,导致内存中重复存储多份全量数据,直接触发内存溢出 - 读取了全部列数据,但最终只需要
MurexCounterpartyRef一列,大量无关数据占用内存 - 全量数据拼接完成后才做去空、去重操作,峰值内存占用过高
- 100的chunksize过小,pandas读取小块数据的额外开销更高,反而会增加内存占用
解决方案
直接按最终需求优化读取逻辑,全程用集合存储结果自动去重,不需要加载全量DataFrame,内存占用可以降到原方案的1%以下,修改后代码如下:
import os import re import pandas as pd from termcolor import colored # 此处保留你原有的CoreMurexFilesLoc路径定义 CoreMurexFilesLoc = "你的文件存储目录路径" def findmefile(directory, containsInFilename): entity_filenames = {} for file in os.listdir(directory): if containsInFilename in file: if file[:5] == "Trade": entity_filenames["MHI"] = file else: entity_filenames[re.findall("(.*?)_", file)[0]] = file return entity_filenames # 获取核心Murex文件名 mhi_tradeFiles = findmefile(CoreMurexFilesLoc, "Trade") mhi_tradeCashFiles = findmefile(CoreMurexFilesLoc, "TradeCash_") mheu_tradeFiles = findmefile(CoreMurexFilesLoc, "MHEU") mheu_tradeCashFiles = findmefile(CoreMurexFilesLoc, "MHEU_TradeCash") # 定义待读取的文件列表 file_list = [ (mhi_tradeFiles, "MHI"), (mheu_tradeFiles, "MHEU"), (mheu_tradeCashFiles, "MHEU"), (mhi_tradeCashFiles, "MHI") ] # 用集合存储结果,自动全局去重,内存占用极低 counterparty_set = set() chunksize = 10 ** 5 # 调整块大小为10万行,平衡读取速度和内存占用 for file_map, entity in file_list: file_path = os.path.join(CoreMurexFilesLoc, file_map[entity]) for chunk in pd.read_csv( file_path, delimiter="|", usecols=["MurexCounterpartyRef"], # 只读取需要的列,大幅降低内存占用 low_memory=False, chunksize=chunksize, on_bad_lines="skip" # 可选:跳过格式异常的长行,避免分词时内存溢出 ): # 块内直接完成清洗:空值过滤、去重 valid_values = chunk["MurexCounterpartyRef"].replace("", float("NaN")).dropna().unique() counterparty_set.update(valid_values) # 转为需要的列表格式 counterpartiesList = list(counterparty_set) print(colored('All Core Murex trade and tradeCash data loaded.', "green"))
如果仍然存在报错,可尝试进一步降低chunksize到1万行,避免单块内存占用过高。
内容的提问来源于stack exchange,提问作者Bruno Lorena
相关产品推荐
相关产品推荐

