Я использую convert
для создания PDF-файла из примерно 2000 изображений:
convert 0001.miff 0002.miff ... 2000.miff -compress jpeg -quality 80 out.pdf
Процесс заканчивается воспроизводимым, когда выходной файл достиг 2 ^ 31-1 байт (2 ГБ -1) с сообщением
convert: unknown `out.pdf'.
Спецификация файла PDF допускает ≈10 ГБ . Я пытался получить больше информации -debug all
, но не нашел ничего полезного в выводе журнала. Файловая система ext3, которая допускает файлы по крайней мере до 16 ГиБ (может быть больше) . Что касается ulimit
, file size
есть unlimited
. /etc/security/limits.conf
содержит только закомментированные строки. Что еще может вызвать это и как я могу увеличить лимит?
Версия ImageMagick: 6.4.3 2016-08-05 Q16
Распространение OpenMP : SLES 11.4 (i586)
linux
imagemagick
limit
Матиас Ронге
источник
источник
Ответы:
Ваше ограничение действительно не вытекает из файловой системы; или из версий пакета, я думаю .
Ваш лимит в 2 ГБ исходит от вас, используя 32-битную версию вашей ОС.
Опция увеличения файла будет установка 64-битной версии, если оборудование поддерживает его .
Смотрите Поддержка больших файлов
источник
off_t
не поможет, если программа попытается создать весь файл в оперативной памяти и записать его на диск за один раз.ptrdiff_t
), которые фактически означают, что размеры должны быть ограничены максимальным (подписанным) значением, котороеptrdiff_t
можно представить, иначе вы получите действительно очень неприятные ошибки, связанные с UB и UB, которых у приложений нет хороший способ обойти.Попробуйте ограничить используемый кэш пикселей,
convert
например, до 1 ГиБ:Надеемся, что это заставит ImageMagic регулярно выгружать уже обработанные данные на диск, вместо того, чтобы пытаться разместить более 2 ГБ в буферах ОЗУ.
Кстати, объем виртуальной памяти, доступной для одного процесса в 32-битном Linux, определяется
VMSPLIT
настройкой ядра. Это может быть 2G / 2G (2 ГБ для ядра + 2 ГБ для пользовательского пространства) или 1G / 3G (1 ГБ для ядра + 3 ГБ для пользовательского пространства). В работающей системе настройку можно найти черезВ некоторых системах
/boot/config-$(uname -r)
вместо этого хранится конфигурация ядра .источник
Если бы не огромное количество фотографий, вы могли бы использовать TeX / LaTeX для создания PDF. Тогда вы все равно можете получить тот же результат (PDF изображений) без проблемы сбоя конвертера. Ограничения на файлы в TeX должны соответствовать вашей системе (аппаратная часть + ОС)
Но я думаю, что вы могли бы использовать скрипт оболочки для написания TeX:
0)
1) сделать шаблон
1.1) Я уверен, что есть способ сделать этот шаг за один раз, заменив имя изображения на переменную и вставив, а не добавляя, и отформатировав $ FOO, чтобы иметь правильные начальные 0, но вот что я знаю ,
1.2) Шаблон нужно разделить, чтобы скрипт вставил имя файла
1.3) nano tmplt1 / * или редактор на ваш выбор * /
1.3.1) Однако ваши файлы отправляются в 0001.miff… 0010.miff… 0100.miff… 2000.miff. Т.е. переменное число ведущих нулей. Обходной путь: 4 версии tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 оканчивается на «... width] {000» (то есть добавляет 3 0); tmplt10-99 оканчивается на «... width] {00» (т.е. добавляет 2 0). 100-999 добавляет 1 ноль, а 1000-2000 совпадает с tmplt1
1.4) следующая часть шаблона: nano tmplt2 / * OEOYC * /
1.5) следующая часть шаблона: nano tmplt3 / * OEOYC * /
1.6) следующий шаблон: nano tmplt4 / * OEOYC * /
2) сделать начало файла: nano head / * OEOYC * /
3) сделать конец файла: nano foot / * OEOYC * /
4) сделать скрипт: nano loader / * OEOYC * /
5) сделать исполняемый скрипт: chmod u + x loader
5.1) После тестирования я обнаружил, что каждый раз, когда $ FOO был вставлен, он был распределен по 3 строкам. Я не знаю другого обходного пути, кроме как войти в сценарий и вручную удалить возврат каретки. По крайней мере, это всего 36 для всех 2000 фотографий
6) вызов скрипта: загрузчик
7) скомпилируйте TeX: pdflatex out.pdf
источник