libvips rotate не оставляет места на устройстве

Я использую libvips для поворота изображений. Я использую виртуальную машину с 3002 МБ оперативной памяти и 512 МБ временного хранилища. Машина AWS Lambda.

Команда, которую я запускаю для поворота изображений,

vips rot original.jpg rotated.jpg d90

Выдает следующую ошибку

Exit Code: 1, Error Output: ERROR: wbuffer_write: write failed unix error: No space left on device

Изображение в формате jpg весит около 10 Мб.


person Vikram Singh Shekhawat    schedule 30.04.2018    source источник
comment
Какой размер изображения в пикселях?   -  person Yves Daoust    schedule 30.04.2018
comment
ширина: 28348 и высота 10104   -  person Vikram Singh Shekhawat    schedule 30.04.2018
comment
Это занимает 820 МБ ОЗУ, умноженное на 2.   -  person Yves Daoust    schedule 30.04.2018
comment
подскажите, пожалуйста, сколько места на диске потребуется для ротации? Поскольку я использую временные файлы для хранения повернутого и исходного изображения. И доступное временное пространство составляет 512 МБ.   -  person Vikram Singh Shekhawat    schedule 30.04.2018
comment
Доступная оперативная память 3002 MB   -  person Vikram Singh Shekhawat    schedule 30.04.2018
comment
That takes 820 MB of RAM, times 2, вы имеете в виду, что 820 МБ ОЗУ и места на Диске два раза 1640. ?   -  person Vikram Singh Shekhawat    schedule 30.04.2018
comment
Нет 1640 МБ оперативной памяти.   -  person Yves Daoust    schedule 30.04.2018
comment
Прошу прощения, но все же я в замешательстве. пожалуйста, очистите вещи. сколько в два раза потребуется ОЗУ? и второе сколько места на диске требуется? Я думаю, что ошибка связана с местом на диске, а не с оперативной памятью.   -  person Vikram Singh Shekhawat    schedule 30.04.2018
comment
@YvesDaoust по умолчанию он должен работать в 150 МБ памяти или 1 ГБ, если вы отключите промежуточный диск.   -  person jcupitt    schedule 30.04.2018
comment
820 МБ ОЗУ для входных и выходных изображений, 20 МБ на диске или 10 при перезаписи).   -  person Yves Daoust    schedule 30.04.2018


Ответы (1)


Вот как libvips повернет ваше jpg-изображение.

Поворот на 90 градусов требует произвольного доступа к пикселям изображения, но изображения JPEG можно читать только строго сверху вниз, поэтому в качестве первого шага libvips должна распаковать JPG в формат произвольного доступа. Для этого используется формат vips (.v), который в значительной степени представляет собой массив C с небольшим заголовком.

Для распакованных изображений размером менее 100 МБ (вы можете изменить это значение, см. ниже) они будут распакованы в буфер памяти. Для распакованных изображений размером более 100 МБ он будет распакован во временный файл в /tmp (это можно изменить, см. ниже).

Затем он выполняет поворот к выходному изображению. Он может делать это как единую потоковую операцию, поэтому ему обычно требуется достаточно памяти для 256 строк развертки на входном изображении и 256 на выходе, то есть в этом случае еще около 30 МБ или около того, плюс еще немного рабочей области для каждого потока.

В вашем конкретном случае входное изображение распаковывается во временный файл размером 30 000 x 10 000 x 3 байта или около 900 МБ. Это намного превышает 512 МБ, которые у вас есть в /tmp, поэтому операция завершается ошибкой.

Самое простое решение — заставить загрузчик загружаться через буфер памяти. Если я попытаюсь:

$ vipsheader x.jpg 
x.jpg: 30000x10000 uchar, 3 bands, srgb, jpegload
$ time vips rot x.jpg y.jpg d90 --vips-progress --vips-leak
vips temp-3: 10000 x 30000 pixels, 8 threads, 128 x 128 tiles, 256 lines in buffer
vips x.jpg: 30000 x 10000 pixels, 8 threads, 30000 x 16 tiles, 256 lines in buffer
vips x.jpg: done in 0.972s          
vips temp-3: done in 4.52s          
memory: high-water mark 150.43 MB
real    0m4.647s
user    0m5.078s
sys 0m8.418s

Флаги leak и progress заставляют VIP сообщать некоторую статистику. Вы можете видеть, что первоначальная распаковка во временный файл занимает 0,97 с, поворот на выходе — 4,5 с, для этого требуется 150 МБ пиксельных буферов и 900 МБ на диске.

Если я подниму порог, я увижу:

$ time VIPS_DISC_THRESHOLD=1gb vips rot x.jpg y.jpg d90 --vips-progress --vips-leak
vips temp-3: 10000 x 30000 pixels, 8 threads, 128 x 128 tiles, 256 lines in buffer
vips x.jpg: 30000 x 10000 pixels, 8 threads, 30000 x 16 tiles, 256 lines in buffer
vips x.jpg: done in 0.87s          
vips temp-3: done in 1.98s          
memory: high-water mark 964.79 MB
real    0m2.039s
user    0m3.842s
sys 0m0.443s

Теперь вторая фаза вращения занимает всего 2 секунды, так как это просто чтение памяти, но использование памяти увеличилось примерно до 1 ГБ.

Эта система представлена ​​в документации libvips здесь:

http://jcupitt.github.io/libvips/API/current/How-it-opens-files.md.html

person jcupitt    schedule 30.04.2018
comment
Я думаю, вы пропустили вставку ссылки - person Vikram Singh Shekhawat; 30.04.2018
comment
Я случайно нажал кнопку «Отправить», дурацкая сенсорная панель ноутбука :( Обновлено. - person jcupitt; 30.04.2018
comment
@user894763 user894763, ха, я уже второй раз вижу, что у тебя не работает тачпад. Вы не можете настроить интервал обнаружения кликов в мс или это что-то еще? - person Nakilon; 01.05.2018
comment
Хе-хе, да, я должен подумать о том, чтобы как-то его отрегулировать. - person jcupitt; 01.05.2018