Intereting Posts
Как объединить значения из нескольких строк с одним и тем же идентификатором в запятую, разделенные уникальным идентификатором preg_match_all () – проблема с получением строки для соответствия в цикле foreach Предотвращение незанятого состояния при загрузке (веб-приложение на iOS) Как просмотреть сведения о сеансе в php с помощью firebug? Наследование класса PHP для начинающих mod_rewrite, чтобы удалить .php, но все равно служить файлу .php? Может ли кто-нибудь подробно описать функцию индексации Magentos? Захват разрешения экрана и отображение результатов на основе размера штормовой мультиланг кажется только процессом 4Mb spout, а затем останавливается почему 0.1 + 0.2-0.3 = 5.5511151231258E-17 в php пакетный ориентир sql в php PHP и jQuery ajax вызов без ожидания ответа Вывод формата $ SimpleXML-> asXML (); MySQL работает без файла сокета Выбор региона страны с открытым исходным кодом в JS

Сломанные результаты пакетного преобразования с помощью командной строки ImageMagick в Linux

Это моя IM-команда:

/usr/bin/convert 'src.tif' -limit memory 0 -limit map 0 -limit file 0 -alpha transparent -clip -alpha opaque -resize 800x600 'end.png' 2>&1 

Таким образом, это удалит белый фон моего TIFF, отсекая путь, указанный в файле. Он будет изменен и сохранен как прозрачный PNG.

Я не получил никаких ошибок от IM, запускающих это.

Но если я запустил эту команду с PHP, чтобы выполнить ее около 13000 файлов, я иногда получаю эти ошибки:

 sh: line 1: 25065 Killed /usr/bin/convert \ 'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \ -limit memory 0 -limit map 0 -limit file 0 -alpha transparent \ -clip -alpha opaque -resize 800x600 \ 'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1 sh: line 1: 25702 Killed /usr/bin/convert \ 'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \ -limit memory 0 -limit map 0 -limit file 0 -alpha transparent \ -clip -alpha opaque -resize 800x600 \ 'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1 

Но большая проблема: некоторые из фотографий сломаны. Ниже «плохое» изображение слева, «хорошее» изображение справа (ondrag / на темном фоне вы видите проблему лучше):

При запуске команды вручную результат был в порядке. Только при запуске этого скрипта PHP-скрипта будут отображаться неверные результаты. ( PHP-скрипт )

Я запускаю сценарий таким образом: php55 run.php . Простой цикл с find как shell-скрипт обеспечивает одинаковые результаты.

Поэтому я искал, задал на сервере обмена сообщениями IM и запускал эту процедуру на двух машинах с разным дистрибутивом (Debian Wheezy, Ubuntu Server 14.04)

Примечание / РЕДАКТИРОВАНИЕ 1: Выполнение команды в терминале с тем же файлом обеспечивает идеальный результат.

EDIT 2: Добавлен пример файла TIFF здесь

Я не уверен, что это ответ. Пока это чистое предположение. Итак, здесь идет …

Установив ограничения на значение 0 , вы в основном говорите ImageMagick: «Ваши ресурсы не ограничены вообще. Вам не нужно заботиться о каких-либо ограничениях».

  • Что делать, если не было предела? Удалите все -limit ... 0 частей из вашей команды. В этом случае ImageMagick будет использовать встроенные значения по умолчанию или другие параметры (которые могут содержаться в файле policy.xml вашей установки IM или через различные переменные среды ). Вы можете запросить текущие пределы вашей системы с помощью следующей команды:

     identify -list resource 

    В моей системе я получаю следующие значения:

     File Area Memory Map Disk Thread Throttle Time --------------------------------------------------------------------------- 192 4.295GB 2GiB 4GiB unlimited 1 0 unlimited 
  • Что делать, если вы установили эти ограничения на разумную величину, которая соответствует действительно доступным ресурсам вашей системы? Предполагая, что у вас есть: 8 ГБ ОЗУ, 50 ГБ свободного места на диске и множество свободных инодов на вашем диске. Затем попробуйте установить его следующим образом: -limit disk 10GB -limit memory 3GB -limit map 6GB .


Управление ресурсами ImageMagick

Для всех своих этапов обработки и промежуточных шагов ImageMagick нуждается в доступе к кеш-памяти / хранилищу промежуточных пикселей , прежде чем он сможет доставить конечный результат.

Эта потребность в хранилище кеш-памяти может быть удовлетворена различными ресурсами:

  • память кучи,
  • анонимная карта памяти,
  • дисковая карта памяти,
  • прямой диск.

ImageMagick использует все эти ресурсы постепенно:

  • Когда память кучи исчерпана, она хранит пиксели в анонимной карте.
  • Как только карта анонимной памяти исчерпана, она создает кеш пикселя на диске и пытается отобразить карту памяти.
  • Когда память памяти памяти исчерпана, она просто использует стандартный диск ввода-вывода.

Дисковое хранилище дешево, но очень медленно: оно находится в 3-х величинах (в тысячу раз) медленнее памяти. Некоторые улучшения скорости (до 5 раз) могут быть получены с помощью сопоставления памяти в кэш на основе диска.

ImageMagick знает о различных способах управления объемом этих ресурсов:

  1. Встроенные значения по умолчанию . Эти ограничения: 768 файлов, 3 ГБ области изображения, 1,5 ГБ памяти, карта памяти 3GiB и 18,45EB дискового пространства.

  2. policy.xml конфигурации policy.xml . Посмотрите, что находится в вашем собственном файле policy.xml . Используйте convert -list policy чтобы сначала найти местоположение этого файла. Затем используйте cat /some/path/policy.xml чтобы увидеть его содержимое. (Файл использует синтаксис XML. Не забывайте: все, что содержится в <!-- и --> является комментарием!) В нем также содержатся комментарии, объясняющие различные детали. Policy.xml может определять гораздо больше, чем только доступные ресурсы ограничения. Настройки в файле policy.xml имеют приоритет над встроенными значениями по умолчанию, если они определены там.

  3. Переменные среды . Ниже приведен список переменных среды, которые могут ограничить ресурсы IM: MAGICK_AREA_LIMIT (пределы области изображения), MAGICK_DISK_LIMIT (ограничение на пробел на диске), MAGICK_FILE_LIMIT (максимальное ограничение количества открытых файлов), MAGICK_MEMORY_LIMIT (ограничение памяти кучи), MAGICK_MAP_LIMIT (ограничение карты памяти ), MAGICK_THREAD_LIMIT (максимальное ограничение количества потоков) и MAGICK_TIME_LIMIT (максимальное истекшее время в секундах). Эти переменные среды, если они установлены, имеют приоритет над файлом конфигурации policy.xml .

  4. -limit <name> <value> в командной строке . Признаются следующие <names> :

    • width (максимальная ширина изображения). Когда предел превышен, исключение прекращается и обработка прекращается.
    • height (максимальная высота изображения). Когда предел превышен, исключение прекращается и обработка прекращается.
    • area (максимальное количество байтов для любого отдельного изображения, которое должно находиться в пиксельной кеш-памяти). Когда предел превышен, наступает автоматическое кэширование на диск (возможно, с отображением памяти).
    • memory (максимальная память, выделенная для кеша пикселей из анонимной отображаемой памяти или кучи).
    • map (максимальное количество для карты памяти, выделенной для кеша пикселей).
    • disk (максимальный объем дискового пространства, разрешенный для использования кешами пикселей). Когда предел превышен, кеш пикселя не создается и генерируется фатальное исключение.
    • files (максимальное количество открытых файлов кеш-пикселей). Когда предел превышен, все последующие пиксели, кэшированные на диск, закрываются и снова возобновляются по требованию.
    • thread (максимальное количество потоков, которое может параллельно).
    • time (максимальное время в секундах, которое разрешено выполнить процессу). Когда этот предел выдается, происходит исключение и прекращение обработки.

    Параметр -limit в командной строке принимает приоритет и отменяет все остальные настройки.