Shell: обработка огромных текстовых файлов

Недавно у меня стояла задача, взять файл в котором разделены разные подстроки при помощи символов tab и | и выделить среди них уникальные (ну и попутно пронумеровать их). А строки в этом файле могут быть распложены хаотически и могут дублироваться.

Казалось бы что там сложного.
Сперва я решил написать решение на perl - открываем дисковую базу данных, ищем есть ли там очередная строка - если есть, пропускаем, если нет - присваиваем новый идентификатор и записываем.

Единственная проблема - размер моего исходного текстового файла составлял 2.5гб :) и там около 28.000.000  уникальных подстрок и суммарно около 110.000.000 вхождений подстрок.

И где-то после первого гигабайта данных perl начинает замедляться до неприемлимой скорости.

Как всегда помог shell

Хитрая комбинация из sed, sort и awk подготовила файл, в котором уже готовые уникальные сторки и присвоенные им номера. При помощи perl остается только импортировать это все в базу (все-таки для последующей обраотки perl нужен). Ну или я пока не придумал, как обойтись без него :)

  • sed - разбиваем все строчки исходного файла на подстроки, так чтоб кажда подстрока была бы на своей собственной строке, убираем лишние пробелы и пусты строки
  • sort -u - сортируем и оставляем только уникальные строки (файл уменьшается в размере раз в 5) (sort -u -S 1024M - не жалейте , дайте sort побольше памяти. Правда у меня он испольовал всего 256мб почему-то)
  • awk - проставляем нумерацию строк (awk ‘{print NR “\t” $0}’ )

А впереди еще 8 гигабайт

Единственная особенность решений на shell - чаще всего для промежуточных результатов требуется место на диске и их нужно сохранять в файл - поэтому для решени задач требуется существенно больше дискового пространства. Но сейчас это уже не проблема - так как диски стоят очень дешево. Существенно дешевле нарастить диск, чем наращивать мощность процессора.

Понравилось? Подпишись на RSS!

Хочешь написать статью? Мы ищем авторов (и не только за красивые глаза, но и за дохлых президентов).

0 Responses to “Shell: обработка огромных текстовых файлов”


  1. No Comments

Leave a Reply