Python无法处理繁重的文件

c3frrgcw  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(121)

我有一个拉链(. gz)日志文件logfile.20221227.gz。我正在编写一个python脚本来处理它。我用一个100行的文件进行了测试,脚本运行正常。当我在几乎5GB的实际日志文件上运行相同的脚本时,脚本被破坏了。请注意,我能够处理高达2GB的日志文件。不幸的是,唯一比这更重的日志文件是5GB +或者7GB+,脚本对这两个都失败了。我的代码如下。

count = 0
toomany = 0 
maxhits = 5000
logfile = '/foo/bar/logfile.20221228.gz'
with gzip.open(logfile, 'rt', encoding='utf-8') as page:
    for line in page:
        count += 1
        print("\nFor loop count is: ",count)
        string = line.split(' ', 5)
        if len(string) < 5:
            continue
        level = string[3]
        shortline = line[0:499]
        if level == 'FATAL':
            log_lines.append(shortline)
            total_fatal += 1
        elif level == 'ERROR':
            log_lines.append(shortline)
            total_error += 1
        elif level == 'WARN':
            log_lines.append(shortline)
            total_warn += 1
        if not toomany and (total_fatal + total_error + total_warn) > max_hits:
            toomany = 1
if len(log_lines) > 0:
    send_report(total_fatal, total_error, total_warn, toomany, log_lines, max_hits)

输出:

For loop count is:  1
.
.
For loop count is:  192227123    
Killed

Killed在这里是什么意思?它没有提供太多的调查只是这一个关键字。还有是有限制的文件大小,有没有办法绕过它。
谢谢你。

kpbwa7wx

kpbwa7wx1#

从更新的代码来看,它可能是memory problem,因为log_lines太大了
尝试将shortline写入临时文件而不是log_lines.append,然后最后通过电子邮件发送文件(或其内容)。
但首先要检查文件的大小,因为通过电子邮件发送可能会太大,然后可以尝试压缩它,也可以直接将临时文件写成gz:

import gzip
with gzip.open('./log_lines.txt.gz', 'wb') as log_lines:
    with gzip.open(logfile, 'rt', encoding='utf-8') as page:
        # ...
        log_lines.write(shortline)

相关问题