2017-01-25 10 views
0

В принципе, я хотел создать скрипт Python для своих ежедневных задач, в котором мне захотелось сравнить два файла с любым размером &, захотелось сгенерировать 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) 

Редактировать-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 => навсегда.

Fix проста: создать 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

Hi Jean-François Fabre & All, Спасибо за комментарий. На самом деле, я нашел проблему в своих оригинальных файлах, которые я обрабатывал. Я обнаружил, что записи в файле содержат много пробелов, которые меняли записи, и это не соответствовало записи в другом файле. Я удалил эти пробелы и теперь получил правильный и действительный выход. Кроме того, выполнение скрипта завершается в течение второго после внесенных вами изменений. – AJNEO999

+0

хорошо! вы можете принять мой ответ тогда :) –

+0

Да, сделано !!!!!! – AJNEO999

Смежные вопросы