Основная проблема:
У меня есть шаг карты, на котором я рендерил большое количество секторов изображения параллельно:
1 2
3 4
worker a -> 1
worker b -> 2
...
merge 1,2,3,4 to make final image
Если он может поместиться в памяти
С изображениями, которые являются относительно небольшими и могут помещаться в ОЗУ, можно просто использовать функциональность PIL:
def merge_images(image_files, x, y):
images = map(Image.open, image_files)
width, height = images[0].size
new_im = Image.new('RGB', (width * x, height * y))
for n, im in enumerate(images):
new_im.paste(im, ((n%x) * width, (n//y) * height))
return new_im
К сожалению, у меня будет много, много больших секторов . Я хочу, наконец, объединить изображения в одно изображение размером примерно 40 000 x 60 000 пикселей, которое, по моим оценкам, составляет около 20 ГБ. (А может даже больше)
Итак, очевидно, мы не можем подойти к этой проблеме в оперативной памяти. Я знаю, что есть альтернативы, такие как memmap
, использование массивов и запись в слайсы, которые я попробую. Однако Я ищу нестандартные решения .
Кто-нибудь знает какие-нибудь более простые альтернативы? Несмотря на то, что все подходы, которые я до сих пор пробовал, на python, он не обязательно должен быть на python .