Resultados rotos en conversión por lotes con la línea de comandos de ImageMagick en Linux

Este es mi comando 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 

Esto eliminará el fondo blanco de mi TIFF al recortar la ruta que se proporciona en el archivo. Se redimensionará y guardará como PNG transparente.

No recibí ningún error de IM al ejecutar esto.

Pero si ejecuto este comando con PHP para ejecutarlo en aproximadamente 13000 archivos, a veces obtengo estos errores:

 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 

Pero el problema más grande es: algunas de las imágenes están rotas. Debajo hay una imagen “mala” a la izquierda, una “buena” a la derecha (ondrag / sobre fondo oscuro, ve el problema mejor):

Al ejecutar el comando manualmente, el resultado fue correcto. Solo al ejecutar este script PHP en bucle obtendremos resultados rotos. ( Script PHP loop )

php55 run.php el script de esta manera: php55 run.php . Un bucle simple con find como script de shell proporciona los mismos resultados.

Así que busqué, pregunté en el servidor de discursos IM y ejecuté este procedimiento en 2 máquinas con diferente distribución (Debian Wheezy, Ubuntu Server 14.04)

Nota / EDITAR 1: ejecutar el comando en el terminal con el mismo archivo proporciona un resultado perfecto.

EDIT 2: se agregó un archivo TIFF de ejemplo aquí

No estoy seguro si esta es una respuesta. Por ahora es pura especulación. Así que aquí va …

Al establecer los límites en un valor 0 , básicamente le está diciendo a ImageMagick: “Sus recursos no están limitados en absoluto. No necesita preocuparse por ningún límite”.

  • ¿Qué pasa si no establece ningún límite? Elimine todo -limit ... 0 partes de su comando. En este caso, ImageMagick usaría sus valores predeterminados incorporados, o las configuraciones definidas de otra manera (que pueden estar contenidas en el archivo policy.xml de su instalación de IM, o mediante diversas variables de entorno ). Puede consultar los límites actuales de su sistema con el siguiente comando:

     identify -list resource 

    En mi sistema, obtengo estos valores:

     File Area Memory Map Disk Thread Throttle Time --------------------------------------------------------------------------- 192 4.295GB 2GiB 4GiB unlimited 1 0 unlimited 
  • ¿Qué pasa si establece estos límites a un valor razonable, que coincida con los recursos realmente disponibles de su sistema? Suponiendo que tiene: 8 GByte de RAM, 50 GByte de espacio libre en disco y muchos inodos libres en el volumen de su disco. Luego intente configurarlo de esta manera: -limit disk 10GB -limit memory 3GB -limit map 6GB .


Gestión de recursos de ImageMagick

Para todo su procesamiento y pasos intermedios, ImageMagick necesita acceso a una memoria / almacenamiento de caché de píxel intermedio, antes de que pueda entregar el resultado final.

Esta necesidad de almacenamiento en caché de píxeles se puede satisfacer con diferentes recursos:

  • memoria de stack,
  • mapa de memoria anónimo,
  • mapa de memoria basado en disco,
  • disco directo

ImageMagick hace uso de todos estos recursos progresivamente:

  • Una vez que la memoria de stack se agota, almacena píxeles en un mapa anónimo.
  • Una vez que se agota el mapa de memoria anónimo, crea la memoria caché de píxeles en el disco e intenta mapearla en la memoria.
  • Una vez que se agota la memoria del mapa de memoria, simplemente usa E / S de disco estándar.

El almacenamiento en disco es barato pero también muy lento: es del orden de 3 magnitudes (mil veces) más lentas que la memoria. Se pueden obtener algunas mejoras de velocidad (hasta 5 veces) utilizando la asignación de memoria a la memoria caché basada en disco.

ImageMagick conoce varias formas de controlar la cantidad de estos recursos:

  1. Valores predeterminados incorporados Estos límites son: 768 archivos, 3 GB de área de imagen, memoria de 1.5GiB, mapa de memoria 3GiB y 18.45EB de espacio en disco.

  2. archivo de configuración policy.xml . Busque lo que hay en su propio archivo policy.xml . Use la convert -list policy para encontrar primero la ubicación de este archivo. Luego use cat /some/path/policy.xml para ver su contenido. (El archivo utiliza una syntax XML. No lo olvide: ¡todo lo que se incluye en es un comentario!) También contiene comentarios que explican varios detalles. Policy.xml puede definir muchas más cosas que solo los recursos de límite disponibles. La configuración en policy.xml tiene prioridad sobre los valores predeterminados incorporados si están definidos allí.

  3. Variables de entorno Aquí hay una lista de variables de entorno que pueden limitar los recursos de IM: MAGICK_AREA_LIMIT (límites de área de imagen), MAGICK_DISK_LIMIT (límite de espacio de disco), MAGICK_FILE_LIMIT (número máximo de límite de archivos abiertos), MAGICK_MEMORY_LIMIT (límite de memoria de montón), MAGICK_MAP_LIMIT (límite de mapa de memoria) ), MAGICK_THREAD_LIMIT (límite máximo de hilos de rosca) y MAGICK_TIME_LIMIT (tiempo máximo transcurrido en segundos). Estas variables de entorno, si se configuran, tienen prioridad sobre el archivo de configuración policy.xml .

  4. -limit configuraciones en la línea de comandos . Los siguientes son reconocidos:

    • width ( width máximo de una imagen). Cuando se excede el límite, se lanza una excepción y el procesamiento se detiene.
    • height ( height máxima de una imagen). Cuando se excede el límite, se lanza una excepción y el procesamiento se detiene.
    • area (número máximo de bytes para que una imagen individual resida en la memoria caché de píxeles). Cuando se excede el límite, se establece en caché automágico en el disco (posiblemente mapeado en memoria).
    • memory ( memory máxima asignada para la memoria caché de píxeles desde la memoria mapeada anónima o el montón).
    • map (cantidad máxima para el mapa de memoria asignado para la memoria caché de píxeles).
    • disk (cantidad máxima de espacio en disco permitida para el uso de la memoria caché de píxeles). Cuando se excede el límite, no se crea el caché de píxeles y se produce una excepción fatal.
    • files (cantidad máxima de archivos de caché de píxeles abiertos). Cuando se excede el límite, todos los píxeles siguientes almacenados en caché en el disco se cierran y se vuelven a abrir a pedido.
    • thread (número máximo de hilos que puede en paralelo).
    • time ( time máximo en segundos que se permite ejecutar un proceso). Cuando se excede este límite, se lanza una excepción y el procesamiento se detiene.

    La configuración de -limit en una línea de comando toma precedencia y anula todas las otras configuraciones.