为了账号安全,请及时绑定邮箱和手机立即绑定

如何在python中解析超大文件?

如何在python中解析超大文件?

白板的微信 2021-04-01 14:15:22
我有这个日志文件“ internet.log”,大约10GB。当我在python中解析它时,出现异常“ MemoryError”。日志文件看起来像这样...Jun 15 16:26:21 dnsmasq[1979]: reply fd-geoycpi-uno.gycpi.b.yahoodns.net is 74.6.160.107Jun 15 16:26:21 dnsmasq[1979]: reply fd-geoycpi uno.gycpi.b.yahoodns.net is 216.115.100.123Jun 15 16:26:21 dnsmasq[1979]: reply fd-geoycpi-uno.gycpi.b.yahoodns.net is 216.115.100.124Jun 15 16:26:21 dnsmasq[1979]: reply fd-geoycpi-uno.gycpi.b.yahoodns.net is 74.6.160.106Jun 15 16:26:21 dnsmasq[1979]: query[A] fd-geoycpi-uno.gycpi.b.yahoodns.net from 192.168.1.33Jun 15 16:26:21 dnsmasq[1979]: cached fd-geoycpi-uno.gycpi.b.yahoodns.net is 74.6.160.106Jun 15 16:26:21 dnsmasq[1979]: cached fd-geoycpi-uno.gycpi.b.yahoodns.net is 216.115.100.124Jun 15 16:26:21 dnsmasq[1979]: cached fd-geoycpi-uno.gycpi.b.yahoodns.net is 216.115.100.123Jun 15 16:26:21 dnsmasq[1979]: cached fd-geoycpi-uno.gycpi.b.yahoodns.net is 74.6.160.107Jun 15 16:26:23 dnsmasq[1979]: query[A] armdl.adobe.com from 192.168.1.24我目前正在使用此方法来解析日志文件:def parse():Date = []IPAddress = []DomainsVisited = []with open("internet.log", "r") as file:    content = file.readlines()    for items in content:        if 'query[A]' in items:            getDate(Date, items)            getIPAddress(IPAddress, items)            getDomainsVisited(DomainsVisited, items)finalResult = [[i, j, k] for i, j, k in zip(Date, IPAddress, DomainsVisited)]return display(finalResult)如果我解析一个说10MB的日志文件,则显示输出,但是当我解析10GB的日志文件时,我得到了错误。我怎样才能解决这个问题?谢谢你。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您不应该使用file.readlines()。这样做会立即将整个文件读入内存,这很可能会立即将其填满。相反,遍历文件:


with open("internet.log", "r") as file:

    for items in file:

(当然,取决于您对数据的处理方式,当您遍历文件时,这仍然可能会中断。)


查看完整回答
反对 回复 2021-04-13
?
守着一只汪

TA贡献1872条经验 获得超3个赞

您正在使用读取整个文件到内存中readlines。


您可以说一次读一行for items in file。


使用更好的变量名和列表理解来稍微整理代码,以生成结果:


with open("internet.log") as log:

    finalResults = [[getDate(line), getIPAddress(line), getDomainsVisited(line)]

                    for line in log

                    if 'query[A]' in line]

我将结果提取到一个函数:


def parse_log_line(line):

    return [getDate(line),

            getIPAddress(line),

            getDomainsVisited(line)]

那么您的代码将是:


with open("internet.log") as log:

    finalResults = [parse_log_line(line)

                    for line in log

                    if 'query[A]' in line]


查看完整回答
反对 回复 2021-04-13
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号