Многопроцессорный пул не работает, несмотря на выделение памяти - PullRequest
0 голосов
/ 24 апреля 2020

Я обработал предварительную обработку, которая должна быть итеративной, используя многопроцессорную обработку.

Приведенный ниже код работает нормально.

wt_adherence = partial(get_wt_adherence, wt=wt_logs, user_profile=user_profile)

n_cpus = multiprocessing.cpu_count()
pool = multiprocessing.Pool(10)
result_wt = pool.map(wt_adherence, accessCodes)         ; print('wt adherence finished')
pool.close()

Проблема возникает, когда приведенный ниже код.

pool = multiprocessing.Pool(10)
result_meal = pool.map(meals_adherence, accessCodes)     ; print('meal adherence finished')
pool.close()

Когда запускается второй скрипт, параллельный процесс показан ниже в Linux ядре (с верхом).

Хотя память была выделена для каждого процесса (10,8%), процессоры не работают.

21934 hoheon    20   0 38.431g 0.035t  29488 S 100.7 14.4  50:22.80 python3                                                                                        
22396 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22397 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22398 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22399 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22400 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22401 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22402 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22403 hoheon    20   0 29.399g 0.027t   3996 S   0.0 10.8   0:00.00 python3                                                                                        
22395 hoheon    20   0 29.399g 0.027t   3984 S   0.0 10.8   0:00.00 python3                                                                                        
22404 hoheon    20   0 29.399g 0.027t   3984 S   0.0 10.8   0:00.00 python3   

Я подозревал, что функция с именем 'foods_adherence' использует фрейм данных pandas размером 1 ГБ.

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 32691788 entries, ('111TN3AT', Timestamp('2018-06-27 00:00:00')) to ('ZZZG24EX', Timestamp('2018-09-24 00:00:00'))
Data columns (total 5 columns):
 #   Column       Dtype  
---  ------       -----  
 0   timeSlot     object 
 1   didSkipMeal  int8   
 2   foodType     object 
 3   foodName     object 
 4   calories     float16
dtypes: float16(1), int8(1), object(3)
memory usage: 966.7+ MB

однако процесс памяти и ЦП не используется, поскольку мой P C имеет объем памяти P C 250 ГБ и 50 ЦПУ. Даже 50% свободного места осталось.

Когда я подожду 3 часа и снова проверю скрипт, также появится следующая ошибка.

Traceback (most recent call last):
  File "3_feature_ext_multiprocessing.py", line 137, in <module>
    result_meal = pool.map(meals_adherence, accessCodes)     ; print('meal adherence finished')
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
    put(task)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 393, in _send_bytes
    header = struct.pack("!i", n)
struct.error: 'i' format requires -2147483648 <= number <= 2147483647

Почему возникает эта проблема?

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