Я написал бы программу, которая проходит через gsipped csv-файл и записывает следующие 4 столбца: target id file row
.
Запустите это для каждого файла, и вы получите ~ 10 миллионов маленьких файлов.
Предполагая, что вы НЕ делаете это распределенным способом, я бы затем объединил файлы в один большой файл и отсортировал его с помощью утилиты сортировки unix.(Предупреждение, что вы хотите сделать LC_ALL=C sort foo.txt
, потому что локаль C работает быстрее и дает более разумные результаты. См. sort, сортировка не соответствует ожидаемой (пробел и локаль) для получения дополнительной информации.)
Теперьэтот файл легко обработать и решить, какой из них оставить.Вы можете записать файл со столбцами file row target id is_keep removed_ids
.Обязательно напишите строку с ведущими нулями, поэтому вместо 42
вы бы написали 000042
.removed_ids
- это те, которые вы удалили из других файлов, если сохранили этот.(Количество старших нулей должно быть достаточно для вашего самого большого файла. То есть, чтобы асцибетический порядок соответствовал числовому порядку.)
Сортируйте этот файл еще раз, а затем разбейте его на файлы для каждого решения.
Учитывая исходный файл gzip и этот файл, какие строки хранить, и какие идентификаторы хранить, если вы сохраните его, легко обработать ваши исходные файлы, чтобы удалить / сохранить строки и записать то, что вы удалили.Я настоятельно рекомендую проверить правильность проверки, что все target / id / row совпадают.И не удаляйте оригиналы, если не пройдена эта проверка работоспособности.
Если вы большой поклонник распределенной обработки, перевод от сортировки к уменьшению карты прост.Если у вас есть инфраструктура для этого, вы можете использовать ее.Если нет, я бы предложил этот подход с сортированными файлами, используя только распараллеливание для обработки всех отдельных файлов в первый / последний.