diff
может быть не самый подходящий инструмент для этого. Я бы попытался написать простой сценарий, который делает именно то, что вы хотите.
Все в памяти
Это очень простое и общее решение. Он загружает два файла в минималистические структуры памяти, вычитает записи subset.txt
из записей all.txt
и записывает остаток.
#!/usr/bin/env python
with open('diff.txt', 'w') as diff:
for record in set(open('all.txt', 'r')) - set(open('subset.txt', 'r')):
diff.write(record)
Сохраните это в файл, как create_diff.py
, затем chmod +x create_diff.py
запустите его в каталоге, где находятся два ваших файла.
Только подмножество в памяти
Если вам потребуется дальнейшая оптимизация для уменьшения занимаемой памяти, это также возможно сделать без загрузки всех файлов в память, особенно all.txt
не нужно загружать их в память полностью, а можно просто повторить один раз.
#!/usr/bin/env python
subset_txt = open('subset.txt', 'r')
subset = subset_txt.readlines()
subset_txt.close()
with open('diff.txt', 'w') as diff_txt:
with open('all.txt', 'r') as all_txt:
for line in all_txt:
if line not in subset:
diff_txt.write(line)
На основе ввода / вывода
Это должен быть самый медленный вариант, потому что он сильно зависит от ввода-вывода, но он занимает мало памяти, поскольку не требует загрузки всех файлов в память. Это работает независимо от того, отсортированы ли ваши файлы или нет, или нет.
#!/usr/bin/env python
diff_txt = open('diff.txt', 'w')
with open('all.txt', 'r') as all_txt:
with open('subset.txt', 'r') as subset_txt:
for all_line in all_txt:
found = False
for sub_line in subset_txt:
if all_line == sub_line:
found = True
break
if found is False:
diff_txt.write(all_line)
subset_txt.seek(0)
diff_txt.close()
Только для отсортированных файлов без дубликатов <- рекомендуется в вашем случае
Если вы уверены, что оба ваших файла упорядочены и не содержат дубликатов, это будет лучшим решением. Оба файла читаются только один раз, и их не нужно загружать в память полностью.
#!/usr/bin/env python
diff_txt = open('diff.txt', 'w')
with open('all.txt', 'r') as all_txt:
with open('subset.txt', 'r') as subset_txt:
subset_line = subset_txt.readline()
for all_line in all_txt:
if all_line == subset_line:
subset_line = subset_txt.readline()
else:
diff_txt.write(all_line)
diff_txt.close()
525953272 × 17 bytes × 2 ≈ 16 GiB
и64 × 0.75 / 16 = 3
. В качестве отправной точки. Не исключено, что утилита diff сможет использовать 2x. Чтоdiff
? Нечто подобноеdiff --version