Operadores de morfologia Scipy ndimage saturam minha memória RAM do computador (8 GB)
Preciso calcular a abertura morfológica para uma matriz 3D de forma (400.401.401), tamanho 64320400 bytes usando um elemento de estrutura 3D com um raio de 17 ou superior. O tamanho do elemento da estrutura ndarray é 42875 bytes. Usandoscipy.ndimage.morphology.binary_opening
, todo o processo consome 8 GB de RAM.
eu liscipy/ndimage/morphology.py
no GitHub, e até onde eu sei, o operador de erosão da morfologia é implementado em C. puro. É muito difícil para mim entender oni_morphology.c
fonte, por isso não encontrei nenhuma parte desse código que leve a uma utilização de memória tão grande. Adicionar mais RAM não é uma solução viável, pois o uso da memória pode aumentar exponencialmente com o raio do elemento da estrutura.
Para reproduzir o problema:
import numpy as np
from scipy import ndimage
arr_3D = np.ones((400,401,401),dtype="bool")
str_3D = ndimage.morphology.generate_binary_structure(3,1)
big_str_3D = ndimage.morphology.iterate_structure(str_3D,20)
arr_out_3D = ndimage.morphology.binary_opening(arr_3D, big_str_3D)
Isso leva aproximadamente 7 GB de RAM.
Alguém tem algumas sugestões de como calcular a morfologia no exemplo descrito acima?