2017-01-25 5 views
0

基本的には、私は日々の仕事のために2つのファイルを比較したいと思っていました&一致するレコードを持つ2つの新しいファイルを生成したかった&不一致レコード両方のファイルから。python - 大きなサイズのファイルを処理する際の問題

私は以下のPythonスクリプト&を書きましたが、いくつかのレコードを持つファイルサイズでは正常に動作しています。

しかし、200,000と500,000レコードのファイルで同じスクリプトを実行すると、結果として生成されるファイルが有効な出力を得られません。

したがって、以下のスクリプトを確認して、間違った出力を引き起こしている問題を特定するのに役立つでしょうか?

ありがとうございます。

from sys import argv 

script, filePathName1, filePathName2 = argv 

def FileDifference(filePathName1, filePathName2): 
    fileObject1 = open(filePathName1,'r') 
    fileObject2 = open(filePathName2,'r') 
    newFilePathName1 = filePathName1 + ' - NonMatchingRecords.txt' 
    newFilePathName2 = filePathName1 + ' - MatchingRecords.txt' 
    newFileObject1 = open(newFilePathName1,'a') 
    newFileObject2 = open(newFilePathName2,'a') 
    file1 = fileObject1.readlines() 
    file2 = fileObject2.readlines() 
    Differece = [ diff for diff in file1 if diff not in file2 ] 
    for i in range(0,len(Differece)): 
     newFileObject1.write(Differece[i]) 

    Matching = [ match for match in file1 if match in file2 ] 
    for j in range(0,len(Matching)): 
     newFileObject2.write(Matching[j]) 
    fileObject1.close() 
    fileObject2.close() 
    newFileObject1.close() 
    newFileObject2.close() 

FileDifference(filePathName1, filePathName2) 

Edit-1:上記のプログラムはエラーなしで実行されます。その出力は間違っており、プログラムは大きなファイルを乗り越えるのに非常に長い時間がかかります。

+0

エラーとは何か、または無効な出力と言うことができます。あなたはいくつかの例を挙げることができます –

+0

'file2'を' set'にしなければならないと言いたいのですが、ルックアップの時間は恐ろしいでしょう。実際には、両方のラインリストからセットを作成し、 'set'メソッドを使用して交差/差分を実行します。はるかに速くなるでしょう。 –

+0

私はあなたが "それは終わらない/それは永遠に走る"という意味だと思いますよね? –

答えて

1

私は野生の推測をして、「有効な出力がない」とは、「永遠に走り、何も役に立たない」ということを意味します。なぜなら、あなたのリスト内包の論理だろう

Differece = [ diff for diff in file1 if diff not in file2 ] 
    for i in range(0,len(Differece)): 
     newFileObject1.write(Differece[i]) 

Matching = [ match for match in file1 if match in file2 ] 
for i in range(0,len(Matching)): 
    newFileObject2.write(Matching[i]) 

彼らはラインの数が少ない上大丈夫ですO(n)のルックアップを実行しますが、len(file1) == 100000を言うならば決して終わらないので、file2です。 100000 * 100000回の反復=> 10 ** 10 =>を永遠に実行します。

修正は簡単です:setsを作成して、はるかに高速、intersection & differenceを使用しています。

file1 = set(fileObject1.readlines()) 
    file2 = set(fileObject2.readlines()) 
    difference = file1 - file2 
    for i in difference: 
     newFileObject1.write(i) 

matching = file1 & file2 
for i in matching: 
    newFileObject2.write(matching) 
+0

こんにちはJean-FrançoisFabre&All、 上記のご意見ありがとうございます。 実際、私が処理していたオリジナルのファイル自体に問題が見つかりました。私は、ファイル内のレコードが、レコードを変更したブランクスペースをたくさん持っていて、他のファイルのレコードと一致していないことがわかりました。 これらの空白が削除され、適切で有効な出力が得られました。 また、あなたが提案した変更後にスクリプトの実行が2秒以内に完了します。 – AJNEO999

+0

良い!あなたは私の答えを受け入れることができます:) –

+0

うん、完了!!!!!! – AJNEO999

関連する問題