在Python中通过大文件搜索字符串
我目前正在进行我的第一个Python项目,我需要通过2GB文件进行解析。 我发现如果我一行一行地走,它会非常非常慢。。。 但是,缓冲方法使用:在Python中通过大文件搜索字符串,python,parsing,search,find,large-files,Python,Parsing,Search,Find,Large Files,我目前正在进行我的第一个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
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)
在这里,打印行不打印“行”,每行一次只打印一个字符。所以我在做子字符串查找时遇到问题。。。
请帮忙
print line
打印一个字符,因为buf
是一个字符串,对字符串进行迭代会将字符串中的字符作为1个字符的字符串
当你说逐行阅读很慢时,你是如何实现阅读的?如果您使用的是readlines(),那么这就可以解释速度慢的原因(请参阅)
文件在其行上是可移植的,Python将在迭代时选择缓冲区大小,因此这可能适合您的需要:
for line in f:
# do search stuff
如果要手动指定缓冲区大小,还可以执行以下操作:
buf = f.readlines(buffersize)
while buf:
for line in buf:
# do search stuff
buf = f.readlines(buffersize)
不过,这两种方法中的第一种通常更好。问题在于buf是一个字符串 说buf=“abcd” 也就是说,buf[0]=a,buf[1]=b等等
for line in buf:
print line
会导致
A.
B
C
d
这意味着在for循环中,不在“行”上循环,而是在buf字符串的所有元素上循环。您可以使用readlines,也可以通过查找“\n”将缓冲区拆分为单行。“for line”功能适用于文件,因为文件迭代器用于将输入拆分为行。这里的字符串迭代器是用来将字符串分解成字符的。使用更大的文件缓冲区,您将获得更好的性能,但我不能保证有多少缓冲区!返回到逐行迭代文件,并尝试打开128K缓冲区(文件名,“r”,128*1024)。注意:您可以使用以避免
while
循环:用于iter中的块(lambda:f.read(1024*1024),“”):#搜索子字符串
。在这种情况下,iter
将创建一个iterable,该iterable调用其callable
参数(即doescallable()
),直到找到sentinel
值。无论如何,读取2GB文件需要一些时间。假设你的硬盘可以以200 MB/s的速度读取,至少需要10秒,我相信HDD通常在50到150 MB/s之间!谢谢,看来我误解了buf的意思。如果我对f中的第行执行了“迭代2G文件”操作,则需要大约2分钟的时间。这可以减少更多吗?如果你不介意把内存抛到一边,你可以mmap文件。(见附件)。除此之外,您可以手动尝试更改缓冲区大小。您是说buf中的行的:l=line.readline()
?@MojingLiu否,他是指buf.split('\n')中的行的
。