Python 2.7 filecmp.cmp возвращает false, даже если сжатые файлы идентичны - PullRequest
0 голосов
/ 26 апреля 2018

Я сравниваю кучу файлов fastq.gz.Каждый файл ~ 4G:

if filecmp.cmp(f1,f2,shallow=False)

Возвращает ложь, так как в f1 и f2 различаются.Но когда я сравниваю файлы, используя diff / comm, я получаю 0 вывод (я распаковываю и сравниваю).Я попробовал оба мелкие = True и False.Я пытаюсь распечатать разницу, но не хватает памяти.

diff=difflib.ndiff((gzip.open(f1)).readlines(),(gzip.open(f2)).readlines())
print [i for i in diff if i.startswith('+')]

Это потому, что файлы разархивированы?какие-нибудь идеи о том, как их сравнить, не разархивируя(каждый файл содержит 200 миллионов строк)

Спасибо!

1 Ответ

0 голосов
/ 26 апреля 2018

В общем случае вам нужно сравнить несжатый вывод.Это единственный способ окончательно определить, имеют ли два файла gzip одинаковое несжатое содержимое.Они могли быть сжаты с разными уровнями сжатия или с помощью другого программного обеспечения gzip, что давало разные сжатые результаты.Единственная гарантия состоит в том, что когда вы сжимаете, а затем распаковываете, вы получаете исходный ввод.Нет никакой гарантии, что когда вы распаковываете, а затем сжимаете, вы получаете исходный ввод.

Если вы контролируете процесс gzip, используя тот же код и те же уровни сжатия и другие параметры, вы можете still получить другой вывод из-за содержимого заголовка.Заголовки могут иметь разные метки времени, разные имена файлов или другие варианты.В этом случае вы можете пропустить заголовки для каждого (используя RFC 1952 в качестве руководства к концу заголовков) и сравнить оставшуюся часть каждого из них.Учитывая указанные условия, остатки двух файлов будут идентичны.

Еще одна вещь, которую вы можете сделать, опять же, если вы контролируете сжатие и знаете, что каждый файл gzip состоит из одного gzipчлен, это то, что вы можете проверить последние восемь байтов каждого файла.Если они не идентичны, то сжатые данные отличаются.Если они одинаковы, то содержимое может быть идентичным, поэтому вам потребуется распаковать и сравнить, или использовать метод, описанный выше.Это может сэкономить много времени, почти не сравнивая файлы gzip с разным несжатым содержимым.Эти последние восемь байтов являются четырехбайтовой CRC несжатых данных и длиной несжатых данных по модулю 2 32 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...