如何在Python中直接将大型CSV转为Pickle以降低内存占用?
处理大型CSV文件的内存问题解决方案
关于直接用Pickle处理CSV的疑问
首先明确:Pickle无法直接处理CSV文本文件。Pickle是Python的对象序列化格式,只能序列化已经加载到内存中的Python对象(比如DataFrame),没办法直接读取纯文本CSV并转成Pickle。你之前报错的核心原因是一次性把5GB的CSV全加载到内存,超出了系统内存上限,和转Pickle的操作无关。
但可以通过分块读取+分块序列化/处理的方式,绕开一次性加载整个文件的问题,既避免MemoryError,也能实现后续的DataFrame计算需求。
分块处理CSV并直接输出结果(推荐)
既然你的最终目标是生成处理后的CSV,没必要先转Pickle,直接分块读取、计算、追加输出到新CSV更高效:
import pandas as pd # 定义分块大小,根据你的内存情况调整,比如10万行一块 chunk_size = 100000 # 输出文件路径 output_path = "processed_data.csv" # 第一次写入时加表头,后续块跳过表头 first_chunk = True for chunk in pd.read_csv("large_file.csv", chunksize=chunk_size): # 在这里做你的计算,新增列操作 chunk["new_column"] = chunk["existing_column"] * 2 # 示例计算 # 输出到CSV chunk.to_csv( output_path, mode="a", header=first_chunk, index=False ) first_chunk = False
如果一定要用Pickle分块存储
如果需要中间用Pickle暂存数据,可以分块序列化到Pickle文件,后续读取时也是分块读取:
分块序列化CSV到Pickle
import pandas as pd import pickle chunk_size = 100000 pickle_path = "data_chunks.pkl" # 分块读取并序列化 with open(pickle_path, "wb") as f: for chunk in pd.read_csv("large_file.csv", chunksize=chunk_size): pickle.dump(chunk, f)
读取Pickle分块并计算
import pickle pickle_path = "data_chunks.pkl" output_path = "processed_data.csv" first_chunk = True with open(pickle_path, "rb") as f: while True: try: chunk = pickle.load(f) # 执行你的计算逻辑 chunk["new_column"] = chunk["existing_column"].mean() # 示例计算 # 输出到CSV chunk.to_csv( output_path, mode="a", header=first_chunk, index=False ) first_chunk = False except EOFError: break # 读取完所有块
关于Pickle读取后的DataFrame可用性
不管是分块还是完整序列化的Pickle,读取后得到的都是标准的pandas DataFrame对象,和直接用read_csv加载的DataFrame完全一样,所有的计算、列操作等功能都可以正常使用,没有任何限制。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

