Распараллеливание без рассола - PullRequest
0 голосов
/ 27 ноября 2018

Алекс Гейнор объясняет некоторые проблемы с рассолами в своем выступлении «Соленья для delis, а не для программного обеспечения» , включая безопасность, надежность, удобочитаемость.Я обычно опасаюсь использовать pickle для данных в моих программах на python.Как правило, я предпочитаю передавать свои данные вручную с помощью json или других форматов сериализации, указанных мной вручную.

Ситуация, которая меня интересует, такова: я собрал некоторые данные в своем pythonпрограмма, и я хочу выполнить смущающе параллельное задание несколько раз параллельно.

Насколько мне известно, самая хорошая библиотека распараллеливания для того, чтобы делать это в python прямо сейчас, распределена по dask, за которой следуют joblib -rallel, concurrent.futures и многопроцессорность.

Однако всеиз этих решений используют рассол для сериализации.Учитывая различные проблемы с pickle, я склонен просто отправлять массив json в подпроцесс GNU parallel.Но, конечно, это похоже на взлом и теряет все прелести Dask.

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Соленые огурцы вредны для длительного хранения («что если мое определение класса изменится после того, как я что-то сохранил в базе данных?») И ужасно для принятия в качестве пользовательского ввода:

def foo():
    os.system('rm -rf /')

return {'lol': foo}

Но яне думайте, что есть какая-то проблема с использованием их в этом конкретном случае.Предположим, вы проходите вокруг datetime объектов.Вы действительно хотите написать свой собственный специальный JSON-адаптер для их сериализации и десериализации?Я имею в виду, что вы можете , а вы хотите ?Соленья хорошо указаны, и процесс идет быстро.Это именно то, что вам нужно, когда вы не сохраняете промежуточный сериализованный объект и не принимаете объекты от третьих лиц.Вы буквально передаете их от себя себе.

Я очень рекомендую выбрать библиотеку, которую вы хотите использовать - вам нравится Dask?Действуй!- и не беспокоиться о его внутренностях до тех пор, пока вам не придётся позаботиться.А пока сконцентрируйтесь на тех частях вашей программы, которые уникальны для вашей проблемы.Хорошие шансы, что основной формат сериализации не будет одним из них.

0 голосов
/ 27 ноября 2018

Страница http://distributed.dask.org/en/latest/protocol.html заслуживает прочтения о том, как Dask передает информацию распределенным работникам и планировщику.Как видно, (облачный) pickle входит в картину для таких вещей, как функции, которые мы хотим передать работникам, чтобы они могли их выполнять, но данные, как правило, отправляются посредством довольно эффективной сериализации msgpack.Не было бы возможности сериализовать функции с JSONНа самом деле, существует довольно гибкий механизм внутренней диспетчеризации, позволяющий решить, что и с каким механизмом сериализовать, но здесь нет необходимости в этом разбираться.

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

-edit-

Конечно, в JSON можно включить названия функций или экранирование, но я бы сказал, что в любом случае это так же хрупко, как рассол.

...