【发布时间】:2013-10-03 15:24:40
【问题描述】:
我目前正在处理我的第一个 Python 项目,我需要解析一个 2GB 的文件。 我发现如果我一行一行地走,那会非常非常慢...... 然而缓冲方法,使用:
f = open(filename)
lines = 0
buf_size = 1024 * 1024
read_f = f.read
buf = read_f(buf_size)
while buf:
for line in buf:
#code for string search
print line
buf = read_f(buf_size)
这里的打印行不打印“行”,它每行一次只打印一个字符。所以我在查找子字符串时遇到问题... 请帮忙!
【问题讨论】:
-
“for line”适用于文件,因为文件迭代器用于将输入分解为行。您在此处拥有的字符串迭代器用于将字符串分解为字符。使用更大的文件缓冲区,您将获得更好的性能,但我不能对多少做出任何承诺!返回逐行迭代文件并尝试 128K 缓冲区
open(filename, "r", 128*1024)。 -
注意:您可以使用
iter(callable, sentinel)来避免while循环:for chunk in iter(lambda: f.read(1024 * 1024), ''): #search the substring。在这种情况下,iter将创建一个调用其callable参数的迭代器(即callable()),直到找到sentinel值。无论如何,读取 2GB 文件将需要一些时间。假设您的硬盘可以以 200 MB/s 的速度读取,这将需要 10 秒至少,我相信 HDD 通常在 50 到 150 MB/s 之间!
标签: python parsing search find large-files