Мне нужно объединить около 30 gzip-текстовых файлов, каждый из которых имеет размер около 10-15 ГБ, каждый из которых содержит многострочные записи, отсортированные по одному и тому же ключу.Файлы находятся в общей папке NFS, у меня есть доступ к ним с нескольких узлов, и у каждого узла есть своя файловая система /tmp
.Какой самый быстрый способ это сделать?
Некоторые возможные решения:
A.Оставьте все это на sort -m
.Для этого мне нужно пропустить каждый входной файл через awk
/ sed
/ grep
, чтобы свернуть каждую запись в строку и извлечь ключ, который будет понятен sort
.Поэтому я бы получил что-то вроде
sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess
B.Посмотрите на питона heapq.merge
.
C.Напишите мой собственный C-код для этого.Я мог бы объединять файлы небольшими партиями, создавать OMP-поток для каждого входного файла, один для вывода, а другой фактически выполнять объединение в ОЗУ и т. Д.
D.Объедините несколько файлов за раз в турнире.
E.Для этого используйте несколько узлов, копируя промежуточные результаты между узлами.
Что бы вы порекомендовали?Я не очень разбираюсь в эффективности вторичного хранения данных, и поэтому мне сложно оценить, как будет работать любой из них.