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 @   香蕉少侠  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示