向大体积CSV文件追加数据时内存占用持续升高问题如何解决
内存上涨原因排查
- 最核心的诱因和CSV文件本身的历史大小无关:你的代码以追加模式
a打开文件,不会加载30万行历史内容到内存。内存持续上涨大概率是全局列表my_data、my_list没有及时清空导致,每次追加数据时你都往这两个列表里新增元素,历史数据一直驻留内存没有释放。 - 你给同步方法
writer.writerow加了await修饰,说明你使用的是第三方异步CSV操作库,部分异步库会默认开启写缓存,缓存数据积累过多也会导致内存占用上涨。 - 标准库
csv.DictWriter本身仅会持有字段名的引用,不会产生额外的冗余内存占用,这部分逻辑不需要调整。
修复方案
- 每次写入完成后立刻清空两个数据列表,释放历史数据占用的内存,同时补充CSV写入的标准参数避免乱码、空行问题:
with open('mydata.csv', 'a', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=cols) for package, li in zip(my_data, my_list): row_data = {} data_to_append_to_row = li.get_text() # 用字典get方法替代异常捕获,逻辑更简洁性能更高 row_data['description'] = package.get('description', '') row_data["core_id"] = data_to_append_to_row writer.writerow(row_data) # 手动刷盘确保数据写入磁盘,避免缓存堆积 csvfile.flush() # 写入完成后清空数据列表,释放内存 my_data.clear() my_list.clear()
- 如果你确实在使用异步CSV库,写入完成后调用对应异步刷盘方法,同时调整库的缓存配置,避免大量数据堆在内存中没有写入磁盘。
- 性能优化可选:如果不需要
DictWriter的字段校验能力,可以换成csv.writer降低额外开销,写入速度更快,内存占用更低。 - 单日追加行数超过1万行时可以分批写入,每写1000行就触发一次刷盘,避免缓存堆积。
内容的提问来源于stack exchange,提问作者L M
相关产品推荐
相关产品推荐

