Я разрабатываю приложение, которое загружает большие изображения JPEG2000 и преобразует их в TIF. Позже он извлекает пиксельные данные, и есть некоторая обработка. Он отлично работает, за исключением одного случая:
Когда я загружаю самое большое изображение и извлекаю данные (массив 10956x10956), программа вылетает, но она только падает в Windows - никогда в Linux. (Я бы хотел использовать портативное приложение).
Я обнаружил проблему, и это связано с ошибкой памяти при интерполяции 20x20 на выборку изображения.
f=RectBivariateSpline(x,y,Sun_angles)
xnew = numpy.linspace(x.min(),x.max(),rows)
ynew = numpy.linspace(y.min(),y.max(),columns)
Sun_angles_new = f(xnew, ynew) #here it crashes
Я также пробовал с interp2d
и mapcoordinates
и я получил тот же результат.
Предполагается, что Python полностью переносится, но оптимизировано впечатление на системы Unix (см. Также: Запуск python на компьютере под управлением Windows против Linux)
Примечание. Я запускаю программу на двух разных компьютерах, но с тем же процессором и оперативной памятью.
Поэтому... что может быть причиной? И есть ли какая-либо другая интерполяция с меньшим потреблением памяти?
Примечание. Одно из решений - разделение изображения на фрагменты и интерполяция.
Вы должны изучить использование памяти в приложении под окнами. Учитывая, что размер исходного изображения будет ~ 360 МБ (если предполагается 24-битное изображение), если вы выделяете память для каждого пикселя, это умножается и может легко превышать требования к памяти 32-битного адресного пространства (вы ограничено ~ 2 ГБ для приложений Windows)
В linux вы, вероятно, используете 64-битный Linux, который работает на 64-битной версии python. Предел в настольном приложении почти недостижим (у вас не будет места подкачки задолго до того, как вы исчерпаете адресное пространство).