Рекомендуемый язык для работы с многопоточными данными

Прямо сейчас я использую комбинацию Python и R для всех моих потребностей в обработке данных. Тем не менее, некоторые из моих наборов данных невероятно велики и сильно выиграют от многопоточной обработки.

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

Насколько я понимаю, ни Python, ни R не являются идеальным языком для этого типа работы (по крайней мере, я не знаю, как реализовать его на любом языке). Какой язык / реализация будет лучшим для этого типа обработки данных?

6
задан chimeracoder 17 August 2010 в 22:22
поделиться

6 ответов

Это можно сделать в Python, используя модуль multiprocessing - он порождает несколько процессов вместо потоков, что обходит GIL и, следовательно, допускает настоящий параллелизм.

Это не означает, что Python - «лучший» язык для этой работы; это субъективный момент, с которым можно поспорить. Но он, безусловно, способен на это.

РЕДАКТИРОВАТЬ: Да, есть несколько способов обмена данными между процессами. Трубы самые простые; они представляют собой своего рода файловые дескрипторы, в которые один процесс может писать, а другой - читать. Прямо из документации:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()

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

6
ответ дан 8 December 2019 в 15:58
поделиться

Сделать многопроцессорную обработку в R довольно просто (и уж точно не сложнее, чем в Python); проверьте пакет multicore и другие перечисленные здесь.

5
ответ дан 8 December 2019 в 15:58
поделиться

Я считаю, что использование R с пакетом foreach - действительно простой способ использовать многопоточность в вашем коде. Используйте doMC или пакет doMPI в качестве параллельной серверной части, если у вас UNIX-подобная система или Windows соответственно. Виньетка должна помочь вам довольно быстро. Этот метод в основном лучше всего подходит для распараллеливания циклов, и я считаю, что использование 7 из 8 ядер на моей машине обычно дает почти шестикратное увеличение скорости. Я не уверен, что вы можете запустить второй процесс на основе результатов первого, но на него стоит взглянуть.

Удачи. Извините, что я новый пользователь и могу опубликовать только одну ссылку, иначе я бы также связал все остальные страницы.

3
ответ дан 8 December 2019 в 15:58
поделиться

На стороне Python, вероятно, лучше всего разделить два шага в двух разных процессах. Есть несколько модулей, которые помогут вам в этом. Вы должны связать два процесса через каналы . Чтобы передавать произвольные данные по конвейеру, вам необходимо сериализовать и десериализовать их. Модуль pickle был бы хорошим кандидатом для этого.

Если вы хотите покинуть корабль, такие языки, как Erlang, Haskell, Scala или Clojure, вероятно, имеют функции параллелизма, которые вы ищете, но я не знаю, насколько хорошо они будут интегрированы с R или другим статистическим пакетом, который вам подходит. .

1
ответ дан 8 December 2019 в 15:58
поделиться

Если я правильно помню (но здесь я могу ошибаться), одной из основных целей Ada95 была параллельная обработка. Это был забавный язык.

Шутки в сторону, я не совсем уверен, насколько хороша эта производительность с точки зрения производительности (но, видя, что вы используете Python сейчас, это не должно быть так уж плохо), но я бы посоветовал Java, поскольку основы многопоточности там довольно просты. (но создать хорошо написанное, сложное многопоточное приложение довольно сложно). Слышал, что библиотека Concurrency тоже довольно хороша, но я еще не пробовал ее.

0
ответ дан 8 December 2019 в 15:58
поделиться

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

Если вы используете eclipse, есть также набор профилирования , который очень полезен при отладке и оптимизации. Однако вызывает довольно большой удар по производительности :)

0
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: