Ошибка памяти Python (Unix против Windows)

1

Я разрабатываю приложение, которое загружает большие изображения 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)

Примечание. Я запускаю программу на двух разных компьютерах, но с тем же процессором и оперативной памятью.

Поэтому... что может быть причиной? И есть ли какая-либо другая интерполяция с меньшим потреблением памяти?

Примечание. Одно из решений - разделение изображения на фрагменты и интерполяция.

  • 2
    Какая архитектура (32-битная или 64-битная) у каждой ОС?
  • 0
    Я проверил снова и память такая же, но процессоры разные. В Windows это 32-битный Core2Duo, а в Linux 64-битный Intel i5 ... извините.
Показать ещё 2 комментария
Теги:
memory

1 ответ

4

Вы должны изучить использование памяти в приложении под окнами. Учитывая, что размер исходного изображения будет ~ 360 МБ (если предполагается 24-битное изображение), если вы выделяете память для каждого пикселя, это умножается и может легко превышать требования к памяти 32-битного адресного пространства (вы ограничено ~ 2 ГБ для приложений Windows)

В linux вы, вероятно, используете 64-битный Linux, который работает на 64-битной версии python. Предел в настольном приложении почти недостижим (у вас не будет места подкачки задолго до того, как вы исчерпаете адресное пространство).

  • 0
    Да, изображение большое, но не так много (~ 250M, так как оно кодировано 12 битами). Вы правы, когда я достигаю 2.32M, программа показывает ошибку памяти. Я пытался разделить изображение, интерполировать по частям ... но это бесполезно. В конце мне нужно объединить все части в одну, а затем снова происходит сбой ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню