Доступно 64 ГБ, сбой cv2 / python при превышении 16 ГБ - PullRequest
1 голос
/ 08 октября 2019

Я загружаю много изображений в память, потому что мне нужно очень часто повторять их, чтобы выполнить произвольное увеличение данных при обучении нейронной сети. Моя машина имеет 64 ГБ памяти и доступно более 60 ГБ. На машине установлена ​​64-битная версия Linux и Python 3.7.4.

Мой сценарий работает до тех пор, пока процесс не превысит 16 ГБ. Затем я вижу это сообщение об ошибке:

cv2.error: OpenCV (3.4.2) /tmp/build/80754af9/opencv-suite_1535558553474/work/modules/core/src/alloc.cpp:55: ошибка: (-4: недостаточно памяти) Не удалось выделить 18874368 байт [это 18 МБ] в функции 'OutOfMemoryError'

Есть ли ограничение внутренней памяти для cv2 и /или python?

Я также попробовал следующее с numpy:

a = np.zeros((16*1024*1024*1024,), dtype=np.uint8)+1

(работает и выделяет 16 ГБ)

a = np.zeros((17*1024*1024*1024,), dtype=np.uint8)+1

(падает)

Так что я думаю, что это проблема с питоном или numpy, поскольку cv2 использует numpy для внутреннего использования.

Интересно, что я могу выделить> 16 ГБ, используя pytorch:

a = torch.ones((28*1024*1024*1024,), dtype=torch.uint8)

(работает, но не удается, когда я пытаюсьболее 28 ГБ)

Забыл упомянуть, что я запускаю все внутри экземпляра SLURM. Но я не знаю, как выяснить, в этом ли проблема, потому что у меня нет другого компьютера с таким объемом памяти.

РЕДАКТИРОВАТЬ: Перед загрузкой каждого изображения я печатаю информацию о памяти, используя psutil. Это прямо перед сбоем:

svmem (всего = 134773501952, доступно = 116365168640, процентов = 13,7, используется = 17686675456, свободно = 112370987008, активно = 18417344512, неактивно = 2524413952, буферы = 176410624,кэшированный = 4539428864, общий = 87986176, slab = 371335168)

1 Ответ

1 голос
/ 22 октября 2019

Проблема не была связана с Python и / или OpenCV. Моя настройка ulimit -v была слишком низкой. Запуск ulimit -v unlimited решает проблему.

...