2016-08-07 17 views
0

私はPythonを使用します。私は100のzipファイルを持っています。各zipファイルには100以上のxmlファイルが含まれています。 xmlfilesの使用私はcsvfilesを作成します。Python、マルチプロセッシング:コードを最適化するには?コードを高速化しますか?

from xml.etree.ElementTree import fromstring 
import zipfile 
from multiprocessing import Process 

def parse_xml_for_csv1(data, writer1): 
    root = fromstring(data) 
    for node in root.iter('name'): 
     writer1.writerow(node.get('value')) 

def create_csv1(): 
    with open('output1.csv', 'w') as f1: 
     writer1 = csv.writer(f1) 

     for i in range(1, 100): 
      z = zipfile.ZipFile('xml' + str(i) + '.zip') 
      # z.namelist() contains more than 100 xml files 
      for finfo in z.namelist(): 
       data = z.read(finfo) 
       parse_xml_for_csv1(data, writer1) 


def create_csv2(): 
    with open('output2.csv', 'w') as f2: 
     writer2 = csv.writer(f2) 

     for i in range(1, 100): 
      ... 


if __name__ == "__main__": 
    p1 = Process(target=create_csv1) 
    p2 = Process(target=create_csv2) 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

コードを最適化する方法を教えてください。コードを高速化しますか?

+1

圧縮されていないxmlファイルのサイズはどれくらいですか?あなたが書いているCSVは? – goncalopp

+0

goncalopp、xmlファイルが淡いです(約10行)。私は2つのcsvファイルしか必要としません。 – Olga

+0

私が処理を行うとhttp://lxml.de/FAQ.html#id1できるだけCレベルでそれをできるだけ多く行うためにlxmlのを使用します –

答えて

2

パラメータを使用して1つのメソッドを定義するだけで済みます。 指定された数のスレッドまたはプロセスにわたって100個の.zipファイルの処理を分割します。追加するプロセスが増えるほど、使用するCPUが増え、2つ以上のプロセスを使用することができます(より速くなります)。

次のコードでは、4または10のプロセスに変更できます。コードをコピー/ペーストする必要はありません。そしてそれは異なるzipファイルを処理します。

あなたのコードは、並列に二度同じ100個のファイルを処理します。それはマルチプロセッシングなかった場合よりもさらに遅くなりました!

def create_csv(start_index,step): 
    with open('output{0}.csv'.format(start_index//step), 'w') as f1: 
     writer1 = csv.writer(f1) 

     for i in range(start_index, start_index+step): 
      z = zipfile.ZipFile('xml' + str(i) + '.zip') 
      # z.namelist() contains more than 100 xml files 
      for finfo in z.namelist(): 
       data = z.read(finfo) 
       parse_xml_for_csv1(data, writer1) 



if __name__ == "__main__": 
    nb_files = 100 
    nb_processes = 2 # raise to 4 or 8 depending on your machine 

    step = nb_files//nb_processes 
    lp = [] 
    for start_index in range(1,nb_files,step): 
     p = Process(target=create_csv,args=[start_index,step]) 
     p.start() 
     lp.append(p) 
    for p in lp: 
     p.join()