2017-04-25 10 views
0

在包含.txt的zipFile中搜索行的最快方法是什麼?快速查找zipfile中沒有內存的行

zipfile的大小約爲100MB,提取後大約700MB,所以我不能提取和讀取內存中的文本文件。

是否有任何可以讀取內存(100 MB)中的zipfile並進行搜索的可能性?

目前我做。

with ZipFile(zip_file) as myzip: 
    with myzip.open(myzip.namelist()[0]) as myfile: 
     for line in myfile: 
      if line.startswith("interesting words"): 
       print(line) 

需要大約15秒。

回答

1

ZipFile您的代碼很懶,無法讀取和解壓縮您的數據。它每次讀取4 Kb的壓縮數據,將其解壓縮到內存中,然後在迭代文件對象時掃描新行。

如果你想一次讀取文件的全部文本,使用這樣的:

with ZipFile(zip_file) as myzip: 
    with myzip.open(myzip.namelist()[0]) as myfile: 
     text = myfile.read() # reads the whole file into a single string 
    for line in text.splitlines(): # you might be able to use regex on text instead of a loop 
     if line.startswith("interesting words"): 
      print(line) 

我不知道這是否會是任何比你當前的代碼更快。如果不是這樣,你可能需要剖析你的代碼,以確保解壓縮是減慢它的部分(而不是其他)。正如我在代碼中所評論的那樣,您可能會發現在text字符串上使用正則表達式搜索比將其分成多行並遍歷它們逐個搜索每一行更好。

+0

我想['re.finditer'](https://docs.python.org/2/library/re.html#re.finditer)可能會加快速度,但不知道 –

+0

text = myfile。讀()而不打內存?它的700MB文件insize zip。我只能讀取大小爲zip文件的100 MB而不是未壓縮的文本。感謝您指出。 – Rahul

+0

當然,它使用了大量的內存,但即使使用Python的開銷,一個700 MB的字符串可能不會超過您的計算機可以處理的數量。這段代碼試圖交換內存使用的速度(雖然我不知道你會看到實際速度有多快)。如果您確實需要儘量減少內存使用量,同時仍然使用簡單的代碼,則您現有的代碼大致如此。 – Blckknght