diff потребляет огромное количество памяти и процессора

У меня есть два файла: all.txt (525 953 272 записи) и subset.txt (525 298 281 запись). Каждая запись представляет собой не что иное, как 17-значное целое число ASCII. Оба файла были отсортированы, и дубликаты записей в каждом файле были удалены. Каждое значение в subset.txt также существует в файле all.txt . Я хочу найти записи в файле all.txt , которые не находятся в подмножестве .txt .

Я пытаюсь запустить diff между этими двумя файлами, думая, что он выпишет строки, которые находятся в all.txt, но не в subset.txt . Аппарат имеет 64 ГБ памяти. diff работает в течение получаса и в настоящее время приобрел около 75% памяти.

Может ли кто-нибудь рассуждать о том, что может происходить, и есть ли аргументы для diff которые могут помочь? Разве это не то, что должен был сделать различие, и есть ли другой подход, который я должен использовать?

  • diff два больших файла CSV (каждый 90 ГБ) и вывод на другой csv
  • Найти отличия в файле и сортировке файла по ключу
  • Как сделать N-образный diff?
  • Вывод различных строк при сравнении двух файлов
  • Определить дубликаты блоков текста в файле
  • Как сравнить два файла в зависимости от значения первого столбца?
  • Сравнение двух файлов и запись несогласованных строк вместе с несогласованными столбцами. Указание несогласованных столбцов - это моя основная проблема
  • Получите разницу между исходными файлами, установленными с apt и текущими файлами
  • 2 Solutions collect form web for “diff потребляет огромное количество памяти и процессора”

    Может ли кто-нибудь рассуждать о том, что может происходить, и есть ли аргументы для diff, которые могут помочь? Разве это не то, что должен был сделать различие, и есть ли другой подход, который я должен использовать?

    Это не то, что должен был сделать различие; когда входы отсортированы (как и у вас), инструмент для задания – comm .

     $ seq 10 15 > subset.txt $ seq 10 20 > all.txt $ comm -13 subset.txt all.txt 16 17 18 19 20 

    Опции comm немного необычны в том, что они отключают вывод. Столбец 1 имеет строки, которые уникальны для файла 1; столбец 2 имеет строки, которые уникальны для файла 2; и столбец 3 имеет строки, которые являются «comm» для обоих. Используя опции -13 мы просим сообщить нам строки, которые находятся только в «all.txt».

    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() 
    Linux и Unix - лучшая ОС в мире.