Я работаю на двухпроцессорной машине с Windows и пытаюсь запустить несколько независимых процессов Python, используя многопроцессорную библиотеку. Конечно, я стремлюсь максимально использовать оба процессора, чтобы ускорить время вычислений. Детали моей машины ниже:
- ОС: Windows 10 Pro для рабочих станций
- RAM: 524 ГБ
- Жесткий диск: Samsung SSD PRO 960 (NVMe)
- Процессор: Xeon Gold 6154 (раз 2)
Я выполняю мастер-скрипт с использованием Python 3.6, который затем порождает 72 независимых от памяти рабочих, использующих многопроцессорную библиотеку. Изначально все 72 ядра моей машины используются на все 100%. Однако примерно через 5-10 минут все 36 ядер на моем втором ЦП сокращают загрузку до 0%, а 36 ядер на первом ЦП остаются на уровне 100%. Я не могу понять, почему это происходит.
Есть ли что-то, чего мне не хватает в отношении использования обоих процессоров на двухпроцессорной машине с Windows? Как я могу гарантировать, что весь потенциал моей машины используется? Как примечание, мне интересно, если бы я использовал ОС Linux, это было бы иначе? Заранее благодарю всех, кто готов помочь с этим.
Ниже приведено представление моего основного сценария Python:
import pandas as pd
import netCDF4 as nc
from multiprocessing import Pool
WEATHERDATAPATH = "C:/Users/..../weatherdata/weatherfile_%s.nc4"
OUTPUTPATH = "C:/Users/....outputs/result_%s.nc4"
def calculationFunction(year):
dataset = nc.Dataset(WEATHERDATAPATH%year)
# Read the data
data1 = dataset["windspeed"][:]
data2 = dataset["pressure"][:]
data3 = dataset["temperature"][:]
timeindex = nc.num2date(dataset["time"][:], dataset["time"].units)
# Do computations with the data, primarily relying on NumPy
data1Mean = data1.mean(axis=1)
data2Mean = data2.mean(axis=1)
data3Mean = data3.mean(axis=1)
# Write result to a file
result = pd.DataFrame( {"windspeed":data1Mean,
"pressure":data2Mean,
"temperature":data3Mean,},
index=timeindex )
result.to_csv(OUTPUTPATH%year)
if __name__ == '__main__':
pool = Pool(72)
results = []
for year in range(1900,2016):
results.append( pool.apply_async(calculationFunction, (year, )))
for r in results: r.get()