Вот как 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
28348
и высота10104
- person Vikram Singh Shekhawat   schedule 30.04.20183002 MB
- person Vikram Singh Shekhawat   schedule 30.04.2018That takes 820 MB of RAM, times 2
, вы имеете в виду, что820
МБ ОЗУ и места на Диске два раза1640
. ? - person Vikram Singh Shekhawat   schedule 30.04.2018