Я обработал предварительную обработку, которая должна быть итеративной, используя многопроцессорную обработку.
Приведенный ниже код работает нормально.
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
Почему возникает эта проблема?