Dask: многопроцессорность работает на Mac, но не на Windows - PullRequest
1 голос
/ 19 октября 2019

Мой многопроцессорный код dask для применения двух разных лямбда-функций применения отлично работает на Mac, но не может работать на сервере Windows 7. Я могу запустить код с многопоточностью в Windows 7, но он очень медленный. Когда я пробую процессы планировщика на сервере Windows 7, загрузка ЦП на всех ядрах достигает 100%, и сервер зависает.

Я могу запустить приведенный ниже код в Windows, используя scheduler = 'threads' или указав num_workers, но этокажется, не задействовать все ядра. С num_workers или многопоточностью на Mac это намного медленнее, чем scheduler='multiprocessing'.

Нужен ли какой-то дополнительный код для Windows, чтобы не перегружать ядра / рабочих?

import pandas as pd
import dask.dataframe as ddf
import multiprocessing

daskdf = ddf.from_pandas(mypandasdataframe, npartitions=4*multiprocessing.cpu_count())


def removecw(df):
    for word in mylist:
        df['A'] = df['A'].apply(lambda x: re.sub(r'\b{}$'.format(re.escape(word)), '', x))
    return df


daskdf = daskdf.map_partitions(removecw, meta = daskdf)
daskdf = daskdf.compute(scheduler='processes')

daskdf.to_csv('outputfilename')

На моем Mac я могу запустить код с ожидаемым результатом (удалив общие слова из конца строк в столбце A). Когда я пробую процессы планировщика на сервере Windows 7, загрузка ЦП на всех ядрах достигает 100%, и сервер зависает.

1 Ответ

0 голосов
/ 19 октября 2019

Windows обрабатывает многопроцессорность немного иначе, чем Mac и Linux.

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

  1. Определите вашу функцию в отдельном модуле
  2. Убедитесь, что ваша функция неявно зависит от каких-либо глобальных переменных. Если вам нужна какая-то дополнительная переменная, например, mylist, то передайте ее явно (метод apply может принимать дополнительные аргументы ключевых слов)
  3. Попробуйте распределенный планировщик на вашем локальном компьютере. https://docs.dask.org/en/latest/scheduling.html#dask-distributed-local
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...