从大文本文件中解析值

时间:2017-09-26 07:39:02

标签: python

我需要解析一个巨大的文本文件(100英镑)并进行一些分析。我虽然拆分文本文件并解析该块并在字典中附加值类似于下面的

import collections
import re
d = collections.defaultdict(lambda: [0,0,0])

bufsize = 65536
with open(path) as infile:
    while True:
        lines = infile.readlines(bufsize)
        if not lines:
            break
        for line in lines:
            temp  = line.split(' ')
            d[temp[0]][0]+=1

            if re.match(r"[2,3].{2}", temp[1]):
                d[temp[0]][1]+=1
            else:
                d[temp[0]][2]+=1

我在if循环中使用if条件。它会影响性能吗?还有其他有效的方法可以用更少的时间来完成这项工作

2 个答案:

答案 0 :(得分:0)

根据Python docs,您需要做的就是使用上下文管理器:

with open(path) as myfile:
    for line in myfile:
        do_something_with(line)

with  建议使用construct,因为即使存在异常也处理所有open/close文件操作,因此ti避免使用try catch块。

此外,在内存效率的同一文档页面中也建议使用for line in myfile。我引用文档:

  

要从文件中读取行,可以循环遍历文件对象。这个   内存高效,快速,并导致简单的代码:for line in f: print(line, end='')

答案 1 :(得分:0)

最好的方法是逐行读取文件并相应地处理每一行(如@rakwaht建议的那样)

但是,当你逐行读取文件时,cpu性能会很高。只要程序运行,它就会达到>90%

现在,如果你想避免cpu性能提升,请引入一个睡眠计数器(这不需要在几秒钟内0.1 seconds就可以了)

with open(path) as fp:
    for line in fp:
        foo(line)
        sleep(0.1)

尝试睡眠计时器。对我来说,当我使用0.1 seconds时,cpu性能下降到6%-7%。如果您的需求远低于此值,则可以将其增加到0.3 seconds。试着将它保持在1 second以下,否则你的程序也会变慢。

注1 :始终尝试降低CPU性能。因为,当您尝试读取1GB文件时,需要花费相当多的时间。你不希望cpu一直加息。其他过程不起作用。现在假设你有一个4GB或更多的文件。 CPU将被堆叠起来 - 当您完成程序执行时,您将听到系统冷却风扇的高旋转速度 - 这使您甚至无法打开另一个应用程序。

注意2 :此外,在处理如此庞大的文件时,切勿尝试将任何内容存储在内存中。这类程序的内存使用量呈指数增长。尝试使用更多的生成器