2017-04-19 13 views
0

私は、複数のxml要素を持つ巨大なファイルを処理しようとする次のコードを持っています。Python - 大きなファイルを読む

from shutil import copyfile 
files_with_companies_mentions=[] 
# code that reads the file line by line 
def read_the_file(file_to_read): 
    list_of_files_to_keep=[] 
    f = open('huge_file.nml','r') 
    lines=f.readlines() 
    print("2. I GET HERE ") 
    len_lines = len(lines) 
    for i in range(0,len(lines)): 
     j=i 
     if '<?xml version="1.0"' in lines[i]: 
      next_line = lines[i+1] 
      write_f = open('temp_files/myfile_'+str(i)+'.nml', 'w') 
      write_f.write(lines[i]) 
      while '</doc>' not in next_line: 
       write_f.write(next_line) 
       j=j+1 
       next_line = lines[j] 
      write_f.write(next_line)  
      write_f.close() 
      list_of_files_to_keep.append(write_f.name) 
    return list_of_files_to_keep 

このファイルのサイズは700 MBを超え、2,000万行以上あります。それを処理するより良い方法はありますか?

ご覧のとおり、前の行と次の行を参照変数(iなど)で参照する必要があります。

私が直面している問題は、非常に遅いということです。すべてのファイルに1時間以上かかり、複数のファイルがあります。

+0

あなたが直面している問題は何ですか?ディスクスペース? – splinter

+0

非常に遅いです。私は元の投稿を編集しました。 – adrCoder

+0

これらのファイルのいくつかを同時に処理する並列処理はどうでしょうか? – splinter

答えて

0

joblibパッケージを使用すると、高速処理に並列処理を使用できます。次のような構造は次のようになり、あなたはfilesと呼ばれるファイルのリストを持っていると仮定すると:あなたが独自に行の合計数を決定するか、一度 場合に、ファイル全体を読み込むべきではありませんすべての

import ... 
from joblib import Parallel, delayed 

def read_the_file(file): 
    ... 

if __name__ == '__main__': 

    n = 8 # number of processors 
    Parallel(n_jobs=n)(delayed(read_the_file)(file) for file in files) 
+0

I/Oがボトルネックであることを恐れています。並列処理はあまり役に立ちません。 –

+0

私は同意します - これはおそらくファイルI/Oの側面を改善するのに使用できます。 – splinter

0

ファースト必要はありません。 thisのようなループを使用すれば、時間を節約できます。 プラスこれの使用についてreadlines()http://stupidpythonideas.blogspot.de/2013/06/readlines-considered-silly.htmlと考えてください。

XML要素を扱っていると考えると、これを簡単にするlibを使用することを検討することをおすすめします。特に執筆のために。

0
  1. 提案は:コンテキストマネージャを使用します

    with open(filename, 'r') as file: 
        ... 
    
  2. 提案:やる読み取りと処理ジャンクワイズ(現在、あなただけ後であなたに、シングルステップでファイルを読んでいますもちろん

    for chunk in file.read(number_of_bytes_to_read): 
        my_function(chunk) 
    

あなたがFを見ているこの道:リスト「ラインごと」)の上に行きますまたはXMLタグの開始/終了を修正してください。

代替:XML Parserパッケージを探します。私はかなりのタグ処理が含まれている、チャンク単位でファイルを処理できるものがあることは確かです。

関連する問題