Вот как 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