libvips rotate выбрасывает свободное место на устройстве - PullRequest
0 голосов
/ 30 апреля 2018

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

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

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 МБ.

1 Ответ

0 голосов
/ 30 апреля 2018

Вот как 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 заставляют vips сообщать о некоторой статистике. Вы можете видеть, что начальное распаковывание во временный файл говорит о 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

...