Эффективно объединяйте отсортированные файлы - PullRequest
1 голос
/ 20 апреля 2011

Мне нужно объединить около 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.Для этого используйте несколько узлов, копируя промежуточные результаты между узлами.

Что бы вы порекомендовали?Я не очень разбираюсь в эффективности вторичного хранения данных, и поэтому мне сложно оценить, как будет работать любой из них.

1 Ответ

2 голосов
/ 10 января 2015

Если вы выберете решение B, включающее heapq.merge, вы будете рады узнать, что Python 3.5 добавит параметр key в heapq.merge () в соответствии с docs.python.org , bugs.python.org и github.com . Это будет отличным решением вашей проблемы.

...