2016-07-27 25 views
0

アーカイブ(tar)からtxtファイルを読み込み、関数でファイルを処理しようとしています。私はたくさんのファイルを持っており、計算を高速化するためにマルチプロセッシングライブラリを使うことに決めました。しかし、私は "ExFileObject 'オブジェクトを"シリアル化できません "というエラーが出ます。以下は私のコードの例です。 'ExFileObject'オブジェクトをシリアル化する方法、またはマルチプロセッシングlibを使用して計算を高速化する方法はありますか?私はPython 3.4を使用していますPython 3.x: 'ExFileObject'オブジェクトをシリアル化できません

import tarfile 
from multiprocessing import Process, Manager 

def start(): 
    result = {} 
    file_path = '...somepath' 
    tar = tarfile.open(file_path, 'r') 
    for file in tar: 
     extr_file = tar.extractfile(file) 
     p = Process(target=straight_calc, args=(extr_file, result)) #thows error 
     p.start() 
     p.join() 
    print(result) 

def straight_calc(file, result): 
    content = file.readlines() 
    for line in content: 
     pass 

if __name__ == '__main__': 
    start() 
+0

"スピードアップ"のためにマルチプロセッシングを使用する場合、あなたが* 1つの*プロセスを開始し、それが完了するのを待っているので、あなたは実際に物事を価値あるものにしているようです。したがって、各ファイルのプロセスを生成するオーバーヘッドを追加しながら、順番に作業しています。 – davka

答えて

0

あなたのサンプルコードは私のためにうまくいきます。 NoneTypeにはreadlinesという属性がなく、tar.extractfile(file)という値がNoneTypeの値を返す可能性があるため、NoneTypeのチェックだけを追加します。

import tarfile 
from multiprocessing import Process, Manager 

def start(): 
    result = {} 
    file_path = '...somepath' 
    tar = tarfile.open(file_path, 'r') 
    for file in tar: 
     extr_file = tar.extractfile(file) 
     if extr_file is not None: 
      p = Process(target=straight_calc, args=(extr_file, result)) 
      p.start() 
      p.join() 
    print(result) 

def straight_calc(file, result): 
    content = file.readlines() 
    for line in content: 
     pass 

if __name__ == '__main__': 
    start() 

あなたはpicklestring = pickle.dumps(extr_file)であなたのextr_fileを酸洗てみてください。 Processを実行する前にextr_fileをpicklingすると、より便利な例外がスローされます。

+0

私は 'd = pickle.dump(extr_file、open(" save.p "、" wb "))'を試みましたが、 "ExFileObject 'オブジェクト"を直列化できません "というエラーもスローされます。また、 'straight_calc(extr_file、result)'関数を呼び出すと動作します。したがって、主な問題は、計算を高速化するために、マルチプロセス(プロセスまたはその他)を使用して関数を呼び出すことです。 – Andrew

+0

私はあなたのコードをtarアーカイブにいくつかのテキストファイルで試しました。私は "ExFileObject 'オブジェクト"をシリアル化できません "を再現できませんでした。あなたのtarファイルはどのように整理されていますか?どの種類のファイルを読もうとしていますか? – aebudak

+0

Googleドライブにアーカイブを作成しました。https://drive.google.com/file/d/0B1myD5vqCbC2cm04elRZN1dPQ2M/view?usp=sharingアーカイブにtxtファイルのあるフォルダがあります。 – Andrew

関連する問題