Каков предпочтительный способ использования параллельных коллекций в Scala? - PullRequest
5 голосов
/ 18 декабря 2010

Сначала я предполагал, что каждый класс коллекции получит дополнительный метод par, который преобразует коллекцию в подходящую параллельную структуру данных (например, map возвращает лучшую коллекцию для типа элемента в Scala 2.8).

Теперь кажется, что некоторые классы коллекций поддерживают метод par (например, массив), но другие имеют методы toParSeq, toParIterable (например, список). Это немного странно, поскольку Array часто не используют или не рекомендуют.

В чем причина? Разве не лучше было бы просто иметь par доступным для всех классов коллекций, делающих «правильные вещи»?

Если у меня есть данные, которые могут обрабатываться параллельно, какие типы мне следует использовать? Черты в scala.collection или тип реализации напрямую?

Или я бы предпочел Arrays сейчас, потому что они, кажется, дешевле распараллелить?

1 Ответ

5 голосов
/ 19 декабря 2010

Списки не очень хорошо подходят для параллельной обработки.Причина в том, что, чтобы добраться до конца списка, вы должны пройти через каждый элемент.Таким образом, вы можете просто рассматривать список как итератор и, следовательно, можете просто использовать что-то более общее, например toParIterable.

. Любая коллекция, имеющая быстрый индекс, является хорошим кандидатом для параллельной обработки.Это включает в себя все, что реализует LinearSeqOptimized, а также деревья и хеш-таблицы.Array имеет настолько быстрый индекс, насколько вы можете получить, так что это довольно естественный выбор.Вы также можете использовать такие вещи, как ArrayBuffer (у которого есть метод par, возвращающий ParArray).

...