Самый простой способ проанализировать один большой текстовый файл на нескольких клиентских компьютерах? - PullRequest
1 голос
/ 24 января 2011

Мне дали задание написать веб-приложение, которое анализирует текстовые файлы с использованием одного регулярного выражения.Размер текстовых файлов от 500 МБ до 3 ГБ.В настоящее время я использую Perl в качестве движка для разбора.Я читал о mapReduce и Hadoop, но похоже, что установка того стоит, учитывая очень, очень большие объемы данных, намного превышающие объемы, которые я анализирую.

Какой хороший способ это сделать?В настоящее время анализ файла 500 МБ занимает от 4 до 6 минут, что не так уж и плохо, но файлы 3 ГБ занимают вечность, и веб-сервер обычно останавливается, прежде чем он сможет получить выходные данные из сценария Perl и сгенерировать отчет.

Ответы [ 2 ]

2 голосов
/ 25 января 2011

На самом деле hadoop удивительно прост в установке и использовании (особенно если у вас нет больших данных и вам не нужно их оптимизировать).Некоторое время у меня была похожая задача (обработка журналов размером около 5 ГБ), и мне потребовалось не более пары часов, чтобы установить ее на 5 машин, используя только руководство и документ на их сайте.Тогда программирование действительно простое, просто читайте из STDIN и пишите в STDOUT!Вероятно, создание собственного скрипта для разделения и распространения (даже если вы создаете его поверх чего-то вроде Gearman) займет больше, чем установка hadoop.

2 голосов
/ 25 января 2011

Давайте разделим ваш файл на 100 частей и используем seek, чтобы позволить произвольному процессу работать с произвольной частью файла.

my $chunk = $ARGV[0];      # a user input, from 0 to 99
my $size = -s $THE_FILE;
my $startByte = int($chunk * $size / 100);
my $endByte = int(($chunk + 1) * $size) / 100);

open my $fh, '<', $THE_FILE;
seek $fh, 0, $startByte;
scalar <$fh>;      # skip current line in case we have seek'd to the middle of a line

while (<$fh>) {
    # ... process this section of the file ...
    last if tell($fh) >= $endByte;
}

Теперь запустите эту программу 100 раз на любых машинах, которые у вас есть, передавая аргументы от 0 до 99 один раз каждой программе.

...