#python #python-3.x #pandas #multiprocessing #pool
#python #python-3.x #pandas #многопроцессорная обработка #Бассейн
Вопрос:
У меня есть pandas
фрейм данных, который выглядит следующим образом:
image_id category sub image_path
1000 A HH images/ID_1000.png
512 A HH images/ID_512.png
1002 C CC images/ID_1002.png
236 B XX images/ID_236.png
... ... ... .....
Какова конечная цель?
- Группируйте изображения по
category
. - Прочитайте все изображения в категории. Преобразуйте его и сохраните на диске с помощью
skimage
. - Скопируйте все значения, соответствующие строке, в которой встречается изображение, в новый фрейм данных и измените его соответствующим
image_path
образом, чтобы указать на преобразованное изображение. - Поскольку фрейм данных является объятием, мне нужно распараллелить этот процесс.
Короче говоря, я хочу распараллелить эту функцию, используя pool
:
def transform_and_save(df, to_generate=5000):
categories = {"A":0, "B":1, "C":2}
save_dir_path = "new_images/"
new_df = pd.DataFrame(columns=df.columns)
final_count=0
for cls in classes_to_aug.keys():
orig_images = df[df["category"]==cls].reset_index(drop=True)
orig_count = len(orig_images)
nb_images_to_gen = to_generate - orig_count
counter = 0
stop = False
while counter < nb_images_to_gen:
for i in range(len(orig_images)):
all_values = orig_images.loc[i]
img = Path(orig_images["image_path"][i])
img_name = img.name
save_name = save_dir_path "newimg_" str(counter) img_name
img = imread(img)
img = resize(img, (200, 200))
imsave(fname=save_name, check_contrast=False, arr=img)
all_values["image_path"] = save_name
new_df.loc[final_count] = all_values
counter = 1
final_count = 1
if counter > nb_images_to_gen:
stop=True
break
if stop:
break
return new_df
Комментарии:
1. Вы проверили swifter ? Его цель — распараллелить операции над
pd.DataFrame
объектами (если это помогает в производительности), возможно, стоит это проверить.2. Ммм, я могу попробовать, но я думаю, что это не решит ту часть, где мне нужно обновить значение, поскольку в этом случае для переменной может быть условие гонки
final_count
3. Конечно, просто выставляю это как возможное жизнеспособное решение.