У меня есть два файла, all.txt (525 953 272 записей) и subset.txt (525 298 281 записей). Каждая запись является ничем иным, как 17-значным целым числом ASCII. Оба файла были отсортированы, и дубликаты записей в каждом файле были удалены. Каждое значение в subset.txt также существует в all.txt . Я хочу найти записи в all.txt , которых нет в subset.txt .
Я пытаюсь запустить diff
между этими двумя файлами, думая, что он запишет строки, которые находятся в all.txt, но не в subset.txt . Машина имеет 64 ГБ памяти. Он diff
работал в течение получаса и в настоящее время получил около 75% памяти.
Может ли кто-нибудь порассуждать о том, что может происходить, и могут ли diff
помочь такие аргументы ? Разве это не то, что diff
должно было быть сделано, и есть ли другой подход, который я должен использовать?
источник
525953272 × 17 bytes × 2 ≈ 16 GiB
и64 × 0.75 / 16 = 3
. В качестве отправной точки. Не исключено, что утилита diff сможет использовать 2x. Чтоdiff
? Нечто подобноеdiff --version
comm
Ответы:
Это не то, что
diff
должно было быть сделано; когда входные данные были отсортированы (как у вас есть), инструмент для работыcomm
.В опции для
comm
немного необычна тем , что они поворачиваются от выхода. Столбец 1 содержит строки, которые являются уникальными для файла 1; столбец 2 содержит строки, которые являются уникальными для файла 2; и в столбце 3 есть строки, которые являются «comm» для обоих. Используя опции,-13
мы просим comm показать нам строки, которые есть только в «all.txt».источник
diff
может быть не самый подходящий инструмент для этого. Я бы попытался написать простой сценарий, который делает именно то, что вы хотите.Все в памяти
Это очень простое и общее решение. Он загружает два файла в минималистические структуры памяти, вычитает записи
subset.txt
из записейall.txt
и записывает остаток.Сохраните это в файл, как
create_diff.py
, затемchmod +x create_diff.py
запустите его в каталоге, где находятся два ваших файла.Только подмножество в памяти
Если вам потребуется дальнейшая оптимизация для уменьшения занимаемой памяти, это также возможно сделать без загрузки всех файлов в память, особенно
all.txt
не нужно загружать их в память полностью, а можно просто повторить один раз.На основе ввода / вывода
Это должен быть самый медленный вариант, потому что он сильно зависит от ввода-вывода, но он занимает мало памяти, поскольку не требует загрузки всех файлов в память. Это работает независимо от того, отсортированы ли ваши файлы или нет, или нет.
Только для отсортированных файлов без дубликатов <- рекомендуется в вашем случае
Если вы уверены, что оба ваших файла упорядочены и не содержат дубликатов, это будет лучшим решением. Оба файла читаются только один раз, и их не нужно загружать в память полностью.
источник