Параллельное чтение текстового файла несколькими виртуальными машинами - PullRequest
0 голосов
/ 22 апреля 2011

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

Рабочие узлы = n

Головной узел, на котором запущены мастер и один рабочий, с n-1 рабочими узлами

Я имею в виду две идеи:

  1. Мастер читает файл построчно, отправляет первую строку первому рабочему узлу, второй второму рабочему узлу и т. Д., Повторяя каждые n строк.

  2. Мастер считывает количество строк в файле. Затем рабочие узлы получили указание на одновременное чтение no_of_lines / n из файла.

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

Кроме того, будет ли проблема блокировки при одновременном доступе к файлам, если каждый узел знает, какие строки он должен читать?

Спасибо за любые предложения

Ian

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

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

Что касается первого вопроса, если IFF все строки в файле имеют постоянную длину, то проблема, как всегда, заключается в эффективности: более эффективно читать несколько строк, чем читать одну строку.

Если бы я занимался проектом, мастер попросил бы рабочих прочитать (n_lines_in_file / n_workers) строки. Мне кажется, мало смысла в том, что мастера читают и раздают их рабочим. Тем не менее, предполагается, что каждая строка занимает столько же рабочих операций, сколько и любая другая.

Если это не так или есть другие переменные, о которых вы не сказали, моя стратегия, несомненно, изменится.

1 голос
/ 22 апреля 2011

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

Сколько времени занимает обработка? Это поможет вам понять, насколько большим должен быть каждый элемент работы, чтобы быть эффективным. Вы можете обнаружить, что оптимальное количество потоков - один. ;)

...