2017-04-25 9 views
0

.txtを含むzipファイル内の行を検索する最速の方法は何ですか?メモリを叩くことなくzipファイル内の行を高速に検索

zipfileのサイズは約100MBで、抽出後は約700MBですので、メモリ内のテキストファイルを抽出して読み込むことはできません。

メモリ(100MB)内のzipファイルを読んで検索する可能性はありますか?

現在行っております。

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です。あなたのデータの読み込みと解凍には怠惰です。 4Kbの圧縮データを一度に読み込み、メモリに展開してファイルオブジェクトを繰り返し処理するときに改行をスキャンします。これは、任意のより速く、あなたの現在のコードよりなる場合、私は見当がつかない

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メモリを使わずにread()を実行しますか?その700メガバイトのファイルはzipをinsizeします。圧縮されていないテキストではなく、zipfileのサイズである100MBまでしか読み込めません。指摘してくれてありがとう。 – Rahul

+0

もちろん、それはたくさんのメモリを使いますが、Pythonのオーバーヘッドでも700 MBの文字列はおそらくあなたのコンピュータが処理できる以上のものではありません。このコードは、速度のためにメモリ使用量を交換しようとしています(実際にどれくらいの速度の利点があるかわかりませんが)。単純なコードを使用しながらメモリ使用量を最小限に抑える必要がある場合は、既存のコードとほぼ同じです。 – Blckknght

関連する問題