在Python中通过大文件搜索字符串

在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

我目前正在进行我的第一个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)
在这里,打印行不打印“行”,每行一次只打印一个字符。所以我在做子字符串查找时遇到问题。。。
请帮忙

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
参数(即does
callable()
),直到找到
sentinel
值。无论如何,读取2GB文件需要一些时间。假设你的硬盘可以以200 MB/s的速度读取,至少需要10秒,我相信HDD通常在50到150 MB/s之间!谢谢,看来我误解了buf的意思。如果我对f中的第行执行了“迭代2G文件”操作,则需要大约2分钟的时间。这可以减少更多吗?如果你不介意把内存抛到一边,你可以mmap文件。(见附件)。除此之外,您可以手动尝试更改缓冲区大小。您是说buf中的行的
:l=line.readline()
?@MojingLiu否,他是指buf.split('\n')中的行的