python многопроцессорная обработка - метод не вызывается с ожидаемыми аргументами - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть объект словаря, содержащий вывод с ключом в качестве «id» и значением в качестве pandas dataframe. Размер словаря составляет 9. Мне нужно сохранить вывод pandas dataframe в отдельных файлах на HDFS для каждого идентификатора. Учитывая время, которое требуется для записи каждого файла как 13 минут * 9 = 107 минут, я пытаюсь распараллелить это так, чтобы каждая запись в файл происходила параллельно.

В рамках этого варианта использования я пытаюсь использовать многопроцессорность, как показано ниже -

def saveOutputs(data):
    print(data[0])
  #logic to write data in file

with Pool(processes = 9) as p:
    for k, v in out.items(): #out is a dict which i need to persist in file
        data = [k,v]
        print(data[0])
        p.map(saveOutputs,data)

Что я вижу, это то, что если мой идентификатор (ключ в dict) равен 1001, то когда saveOutputs вызывается как часть print в saveOutputs, он печатает значение как 1 вместо 1001, тогда как в моем Блок пула перед вызовом saveOutputs, оператор print печатает 1001.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Я нашел решение. Проблема в том, что вызывающая функция должна иметь аргументы типа str. Если вы передаете некоторые объекты, такие как словарь, он не работает должным образом.

0 голосов
/ 22 февраля 2020

p.map работает не так, как вы думаете.

Когда вы вызываете p.map(function,data), если данные являются массивом (как в вашем случае), тогда пул будет работать function на каждый элемент data:

def saveOutputs(data):
     print(data)

out={1001:"dummy", 1002:"foo", 1003:"bar"}

with Pool(processes = 9) as p:
    for k, v in out.items(): #out is a dict which i need to persist in file
        data = [k,v]
        print(data)
        p.map(saveOutputs,data)

даст вам:

[1001, 'dummy']
1001
dummy
[None, None]
[1002, 'foo']
1002
foo
[None, None]
[1003, 'bar']
1003
bar
[None, None]

Для первой пары данных выполняется два вызова function, каждый с соответствующим элемент пары.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...