У меня возникают трудности с пониманием логики оптимизации мульти-роции в Python 3.11. < /p>
Контекст: < /h1>
Я работаю на Ubuntu 22.04, x86 12 ядер /32 потока, память 128 ГБ < /p>
Проблемы: < /h1>
(пожалуйста, см. Код и результат ниже).
Обе многопроцессорная функция с использованием локального DF (с помощью MAP+Partial или Starmap) занимают гораздо больше времени, чем многопроцессорное использование Global DF.
Это показалось для меня в порядке, но ... в Ubuntu), так что я думаю DF должен быть дублирован даже при объявлении Global .
мой вопрос (в конце концов:-))
< ul>
Почему многопроцессы с использованием локального DF занимают так много времени по сравнению с использованием глобального DF, если память копируется в каждом процессе (будь то локальный или глобальный)? < /li>
Или, может быть, системный монитор в Ubuntu Сообщите память, доступную для процесса, и не обязательно ее внутренний след? (Общая память затем появилась бы дублированная в нескольких процессах, и сумма всех этих процессов может быть больше, чем моя системная память)? < /li>
< /ul>
Спасибо за просветление < /p>
code < /h1>
from time import sleep
from multiprocessing import Pool
from functools import partial
from time import time
import numpy as np
import pandas as pd
def _fun_local(df, imax: int):
# sleep(10)
df_temp = df[:imax]
return df_temp
def _fun_global(imax: int):
global mydf
# sleep(10)
df_temp = mydf[:imax]
return df_temp
def dummy():
# Create a 1 GB df
global mydf
n_rows = 13_421_773
n_cols = 10
data = np.random.rand(n_rows, n_cols)
mydf = pd.DataFrame(data, columns=[f'col_{i}' for i in range(n_cols)])
# check memory footprint
print('mydf', mydf.memory_usage(deep=True).sum() / 1024 / 1024)
imaxs = range(1, 33)
# With local df, call function with partial
start = time()
with Pool() as pool:
fun = partial(_fun_local, mydf)
results_partial = pool.map(fun, imaxs)
print(f'local-partial took: {time()-start}')
# With local df, call function with starmap
start = time()
with Pool() as pool:
results_starmap = pool.starmap(_fun_local, [(mydf, imax) for imax in imaxs])
print(f'local-starmap took: {time()-start}')
# With global mydf
start = time()
with Pool() as pool:
results_global = pool.map(_fun_global, imaxs)
print(f'global took: {time()-start}')
return results_local, results_global
if __name__ == '__main__':
results = dummy()
< /code>
Результат: < /h1>
mydf (MB): 1024.0001411437988
local-partial took: 89.05407881736755
local-starmap took: 88.06274890899658
global took: 0.09803605079650879
Подробнее здесь: https://stackoverflow.com/questions/793 ... ultiple-ar