我需要解析一个巨大的文本文件(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条件。它会影响性能吗?还有其他有效的方法可以用更少的时间来完成这项工作
答案 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 :此外,在处理如此庞大的文件时,切勿尝试将任何内容存储在内存中。这类程序的内存使用量呈指数增长。尝试使用更多的生成器