Python:处理大数据量文件心得

完成大文件按规则拆解。使用python实现将5个多g,总共五千万行数据的csv文件进行按照某个特殊时属性进行拆解。
问题难点:文件过大,服务器内存资源不足,需要分块读入内存并处理。之前想着一次性全部读入,然后再根据分类条件写入对应文件,但是总会出现内存溢出(因为一次性读入之后需要分类排序)或者执行效率过低(因为需要一条条的分类然后一条条的插入文件)的问题。
解决方案:使用pandas分块读取文件内容,然后依次分类处理。其中补充了较多的日志信息,便于查看。
因为是脚本执行,所以使用命令行将日志导入到log文件中去。python 脚本.py >> log.log 2>&1 代码如下: import pandas as pd from pathlib import Path # 批量分块读取csv并处理 success # 读取原始 CSV 文件 input_file_path = '你自己的文件.csv' chunk_size = 100000 # 每次读取的行数 num = 0 # 遍历文件,逐块读取 for chunk in pd.read_csv(input_file_path, chunksize=chunk_size): # 根据 terminalId 拆分数据框 grouped_df = chunk.groupby('terminalId') print("大块数量:" + str(len(grouped_df)) + "==========================") # 遍历每个分组,保存为单独的 CSV 文件 for terminal_id, group_df in grouped_df: # 指定保存路径和文件名,可以根据需要自定义 output_file_path = f'/home/user/tstar/handleCsv/data/batch/{terminal_id}.csv' # output_file_path = f'{terminal_id}.csv' print("tId:" + str(terminal_id) + ",group.size = "+ str(len(group_df)) + "=====") num += len(group_df) print("num:" + str(num)) # 判断文件是否存在,如果已经存在,则将该部分写入已经存在的文件中 file_path = Path(output_file_path) # 如果文件存在,则将数据追加到文件末尾 if file_path.exists(): print(str(terminal_id) + "存在") group_df.to_csv(output_file_path, mode='a', header=False, index=False) else: # 该文件不存在,则保存分组数据框,保持表头相同 print(str(terminal_id) + "文件不存在") group_df.to_csv(output_file_path, index=False) print("全部读取完成:num=" + str(num))
posted @ 2024-02-15 10:02  香蕉少侠  阅读(97)  评论(0)    收藏  举报