Q : "... я (I) прав насчет , используя его? "
A) multiprocess != multiprocessing
Ну, вы, возможно, уже заметили, что multiprocessing
-модуль не то же самое, что и multiprocess
-модуль Майка МакКернса. (Обещания и свойства последних остаются в наши дни скрытыми, так как сопровождающие модуля опубликовали документацию модуля на RTFM сайте (да, ReadTheDocs первоначально использовал Read-The- F ***** g-Manual идентификатор сайта, так что я не представляю) , который в настоящее время недоступен, так как перевод адреса на https://multiprocess.readthedocs.io/en/latest/ вообще не отображает контент, относящийся к модулю multiprocess
(было бы замечательно, если бы @Mike McKerns вмешался и исправил бы этот дефицит, так как иначе Pathos, Dill и другие части его опубликованной работы известны своей невероятно великие части программного обеспечения, не так ли?).
B) Вы платите намного больше, чем когда-либо получите обратно
Если вы пытаетесь избежать дублирования DataFrame
-инстанций, мотивированный потолком оперативной памяти, вы не можете использовать многопроцессорность на основе процессов. Это приводит к ловушке наличия, но pure- [SERIAL]
, центральной диктатуры GIL-замка, предписывающей один за другим один шаг за шагом (без увеличения производительности, но совсем наоборот ... оплачивая дополнительные расходы на мультиплексирование потоков, все ожидают как собственного удержания GIL-блокировки, так и свободного оперативного ввода-вывода, чтобы получить некоторые данные для выборки / жевания / хранения (процесс)).
Если вы пытаетесь войти в процессы, порожденные linux (несущими риск при этом - посеять документы / вопросы по деталям) и использовать Manager()
- экземпляр (эй, да, снова GIL-блокировка блокирует только одно ядро процессора - мы уже слышали об этом, не так ли?) или другие подобные синтаксические приемы для доступа или организации доступа к global
-s или "общие" объекты из основного, опять же, затраты на это будут go, что дико против вашей желаемой производительности, что (за исключением использования маскировки задержки ввода-вывода в сети- случаи) никогда не будет ощутимого преимущества, часто совсем наоборот - вы заплатите намного больше с точки зрения дополнительных накладных расходов, чем когда-либо будете получать обратно с точки зрения желаемого увеличения производительности.
Если передать все DataFrame
-экземпляры через Передача параметров (как пытается сделать ваш синтаксис), ваши процессы (будь то разветвленные или порожденные) будут платить еще больше дополнительных накладных расходов (и все будут иметь полномасштабные копии оригинальных ( df1, df2, df3, )
... да , RAM докажет это) плюс ваши накладные расходы, связанные с многопроцессорностью, будут включать огромные и разрушительные затраты SER / DES , так как эти куски мяса BIG-FAT должны будут go через SER / DES (чаще всего реализуется через SER-фазу в pickle.dumps()
+ XFER-фазе через p2p-передачу данных (поток данных) + DES-фазу в pickle.loads()
... все это выполнено 3 * len ( [ slice for slice in slices ] )
-процессов, имея предельное значение для конфликтов ОЗУ, имеющее дросселирование конфликтов ЦП с помощью центрального GIL-замка на стороне __main__
, из-за необходимости сначала выполнить все три ( SER, XFER, )
- фазы на его стороне, если позволяет оперативная память, до того, как «удаленные» фазы -DES go начнут продвигаться вперед, то, скорее всего, уже начался тяжелый переброс подкачки.
Так что любой из них больше похож на anti-pattern для любых высокопроизводительных вычислений, не так ли?
Если бы не все эти проблемы, связанные с Python / GIL, наука о производительности идет против вас - см. ловушки speedup в пересмотренном Законе Амдала для подробностей и количественных методов.
В сомнениях?
Ориентир, бенчмарк, эталон.
Факты имеют значение.