Я написал код для очистки данных. Рабочая функция — «single_worker», присваивающая значения от «a» до «l», если значение первого столбца превышает пороговые значения. Поскольку весь набор данных довольно большой, я разделил его на 8 подмножеств для этого метода многопроцессорной обработки. Однако, когда я запускаю этот код в cmd, на самом деле работает только один процесс над подмножеством 1, и когда этот процесс завершается, для подмножества 2 больше нет процесса.
Моя версия Python 3.7 со всеми пакетами anaconda. Компьютерная система Win10 с 12 ядрами.
Вот функция:
def single_worker(merge, beme, me,a):
c = 0
year_1 = 0
month_1 = 0
length = len(merge)
for i in trange(length):
c = c + 1
year = merge['year'][i]
month = merge['month'][i]
if (year != year_1) | (month != month_1):
key_beme = beme[beme.year == year].index.tolist()
k=key_beme[0]
beme6 = beme['6'][k]
beme14 = beme['14'][k]
key_me = me[(me.year==year)&(me.month==month)].index.tolist()
b=key_me[0]
me10 = me['10'][b]
year_1 = year
month_1 = month
if ~(merge['me'][i] > 0):
merge['bs_new'][i] = np.nan
continue
if merge['me'][i] <= me10:
merge['bs_new'][i] = 's'
else:
merge['bs_new'][i] = 'b'
if ~(merge['bm'][i] > 0):
merge['hl_new'][i] = np.nan
continue
if merge['bm'][i] <= beme6:
merge['hl_new'][i] = 'l'
elif merge['bm'][i] >= beme14:
merge['hl_new'][i] = 'h'
else:
merge['hl_new'][i] = 'm'
name = str(a)+".csv"
merge.to_csv(name)
Вот код:
import pandas as pd
import numpy as np
from tqdm import trange
from multiprocessing import cpu_count
from multiprocessing import Pool
from single_worker import single_worker
merge = pd.read_csv('merge.csv')
beme = pd.read_csv('beme.csv')
me = pd.read_csv('me.csv')
Len_imgs = len(merge)
num_cores = cpu_count()
if num_cores >= 8:
num_cores = 8
subset1 = merge[:Len_imgs // 8]
subset2 = merge[Len_imgs // 8: Len_imgs // 4]
subset3 = merge[Len_imgs // 4: (Len_imgs * 3) // 8]
subset4 = merge[(Len_imgs * 3) // 8: Len_imgs // 2]
subset5 = merge[Len_imgs // 2: (Len_imgs * 5) // 8]
subset6 = merge[(Len_imgs * 5) // 8: (Len_imgs * 6) // 8]
subset7 = merge[(Len_imgs * 6) // 8: (Len_imgs * 7) // 8]
subset8 = merge[(Len_imgs * 7) // 8:]
List_subsets = [subset1, subset2, subset3, subset4,
subset5, subset6, subset7, subset8]
print("Finish separating subsets")
p = Pool(num_cores)
k=0
for i in range(num_cores):
k=k+1
p.apply_async(single_worker, (List_subsets[i], beme, me,k,))
print(k)
p.close()
p.join()
Кстати, когда он был запущен, я проверил диспетчер задач. Загрузка ЦП всегда ниже 25%. Я не знаю, если это проблема с моим кодом. Пожалуйста, взгляните. Спасибо за ваше время.
1 ответ
Я пытался не использовать trange в определенной мной функции, и это работает. Это кажется странным, и я не знаю причины.
Похожие вопросы
Новые вопросы
python-3.x
НЕ ИСПОЛЬЗУЙТЕ, ЕСЛИ ВАШ ВОПРОС ТОЛЬКО ДЛЯ PYTHON 3. Всегда используйте вместе со стандартным тегом [python].
if ~(merge['me'][i] > 0)
почти наверняка не делает то, что вы хотите. Побитовые операции бесполезны с булевыми значениями, потому что~True
равно -2, что по-прежнему верно. Вы, вероятно, хотитеif not (merge['me'][i] > 0)
илиif merge['me'][i] <= 0
(и что-то подобное для других мест, где вы используете~
).multiprocessing
в Windows код вашего скрипта обычно должен находиться внутри блокаif __name__ == '__main__'
, иначе он не будет работать должным образом.