2013-04-28 4 views
5

Итак, я просмотрел массу статей и форумов, прежде чем публиковать их, но я продолжаю читать противоречивые ответы. Во-первых, ОС не проблема, я могу использовать либо Windows, либо Unix, что бы ни было лучше для моей проблемы. У меня есть тонна данных, которые мне нужно использовать для целей только для чтения (не знаю, почему это имеет значение, но в случае, если это так, структура данных, которую я собираюсь пройти, представляет собой массив массивов массивы хешей, значения которых также являются массивами). Я по существу сравниваю «запрос» с тонны разных «предложений» и вычисляет их относительные сходства. Из этих величин (несколько миллионов) я хочу взять верхнюю часть x% и сделать с ними что-то. Мне нужно распараллелить этот процесс. У меня просто нет хорошего способа уменьшить пространство - мне нужно сравнить все, чтобы получить хорошие результаты, и это займет слишком много времени с какой-то резьбой/разветвлением. Опять же, я видел много противоречивых ответов и не знаю, что делать.Threading vs Forking (с объяснением того, что я хочу делать)

Любая помощь будет оценена по достоинству. Заранее спасибо.

EDIT: Я не думаю, что объем используемой памяти будет проблемой, но я не знаю (8 ГБ оперативной памяти)

+1

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

+0

Я не вижу здесь вопроса. – jordanm

+0

Вопрос в том, что я должен использовать: нарезание резьбы или наложение? –

ответ

16

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

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

Когда дело доходит до forking, я буду говорить только о Unix. Perl эмулирует fork в Windows с помощью потоков, он работает, но он может быть медленным и ошибочным.

Разветвляющегося Преимущество

  • Очень быстро создать вилку
  • Очень надежного

Разветвление Недостатки

  • Связь между процессами могут быть замедленными ш и неудобные

Преимущества темы

  • координация резьбы и обмен данными довольно легко
  • Нити довольно проста в использовании

Thread Недостатки

  • Каждый поток занимает много памяти
  • Потоки могут быть медленным, чтобы начать
  • Темы могут быть багги (лучше более недавнее ваше Perl)
  • Database connections are not shared across threads

Это последнее немного если документация обновлена. Если вы собираетесь делать много SQL, не используйте потоки.

В целом, чтобы получить хорошую производительность из потоков Perl, лучше всего создать пул потоков и повторно использовать их. Форкс легче создавать, использовать и отбрасывать.

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

Для обоих случаев вы, вероятно, захотите что-то управлять своим пулом работников. Для разветвления вы захотите использовать Parallel::ForkManager или Child. Ребенок особенно приятен, так как он встроил межпроцессное общение.

Для тем вы должны будете использовать threads::shared, Thread::Queue и читайте perlthrtut.

При чтении статей о потоках Perl имейте в виду, что они были немного дерьмовыми, когда они были введены в 5.8.0 в 2002 году и только исправны по 5.10.1. После этого они значительно укрепились. Информация и мнения об их эффективности и надежности, как правило, быстро устаревают.

+0

Большое спасибо! –

+1

Отличный ответ. – squiguy

+1

['use forks;'] (http://metacpan.org/module/forks) – Zaid

0

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

Вилка может быть проще реализовать, но использовать значительный объем памяти.

Если у вас нет опыта с любым из них, я бы начал с реализации версии forking & оттуда.

+2

В Perl это совсем наоборот. – Schwern

+0

Итак, вы бы предложили потоки? Поскольку потоки будут работать полностью независимо, пока они не выплюнут результаты, мне даже нужно будет использовать что-то вроде 'join()'? –

Смежные вопросы