ImageMagick convierte y baja RAM

12

Considere el siguiente comando para el paquete imagemagick:

sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

Ahora test1.jpges una imagen bastante grande (12.5MB), pero de tamaños no desconocidos, pero el servidor desde el que estoy trabajando solo tiene 1G de memoria ( Amazon EC2 t2.micro si ayuda)

No se produce ningún error y, sin embargo, no test2.jpgse crea ninguno . He probado esto con imágenes más pequeñas y funciona bien. Hubiera pensado 1G si la memoria fuera suficiente para gestionar un cambio de tamaño, pero ¿quizás no?

¿Cuáles son mis opciones? ¿Tengo que obtener más memoria o me falta algo?

Cualquier sugerencia es muy bienvenida!

Ediciones solicitadas

el resultado de strace muestra: +++ killed by SIGKILL +++junto con muchos comandos que se ven normales (abrir /usr/share/localy leer cadenas largas, que supongo que son datos de imagen)

gratis me da:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

Por lo tanto, parece que el intercambio no está habilitado, por lo que buscaré crear un archivo de intercambio para ver si esto soluciona mis problemas.

El archivo me da:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

También pegaría el / path / to / img completo pero desafortunadamente contiene datos confidenciales (direcciones de correo electrónico del cliente, etc.)

Afire
fuente
1
¿Por qué estás usando sudoeste comando?
Charles Green
1
Recibí el mensaje "Asesinado" cuando no lo hice
Aphire
3
Ypu puede tratar de limitar la memoria utilizada para la memoria caché de píxeles con el argumento -limit memory 64MiB(32MiB es probablemente demasiado pequeño. El valor predeterminado es 1.5GiB). Y debería darle una salida descriptiva en caso de que falle.
dadexix86
2
Intente ejecutar el comando con un straceanexo delante del comando, vea qué llamadas al sistema se realizan, si se producen errores. Háganos saber
Sergiy Kolodyazhnyy
2
Hecho. ¡Me alegra que lo hayas resuelto! la salida libre confirma que el intercambio está desactivado y la información del archivo confirma que no es un archivo mal identificado. Buena edición! +1
Élder Geek

Respuestas:

7

Supongo que te estás quedando sin RAM. Puede verificar esto con watch cat /proc/meminfomientras su proceso se está ejecutando.

Es posible que tenga RAM o SWAP insuficientes para realizar su tarea.

Debido a la condición de baja ram, asegúrese de que el intercambio esté activado swapon -ay, si no hay un intercambio configurado en el sistema, cree una partición para el intercambio en el espacio de disco no utilizado y actívelo. Esto probablemente resolverá el problema. Hay una buena respuesta de @Takkat sobre cómo hacerlo aquí. Si no tiene acceso a la partición del servidor, también puede usar un archivo de intercambio para el intercambio

Elder Geek
fuente
1
OP se trata de un servidor en la nube, la creación de una partición de intercambio puede no ser una opción. También puede agregar Cómo agregar un nuevo archivo de intercambio .
user.dz
@Sneetsher Eso es exactamente lo que hice, buen comentario
Aphire
@Sneetsher "OP es sobre un servidor en la nube" no estaba claro (al menos para mí) de los datos en la pregunta, pero usted hace un buen punto. editando la respuesta.
Élder Geek
@ElderGeek, en realidad está pero no está bien resaltado Amazon EC2 t2.micro, edité la pregunta para dejarla clara, agregué la etiqueta también para vincularla fácilmente con otras preguntas relacionadas.
user.dz
@Sneetsher Lo veo ahora. ¡Gracias por tus esfuerzos!
Élder Geek
5

El problema en la pregunta se resolvió agregando el intercambio apropiado. Para completar, permítanme dar un resumen de las opciones adicionales que tenemos al ejecutar Image Magick converten archivos enormes en sistemas con poca memoria, o cuando no hay intercambio disponible, o el intercambio era demasiado pequeño.

Los métodos mencionados a continuación se detallan en el manual de Image Magick:

Manejo de imagen realmente masivo


Resumen:

  1. Limite el uso de memoria con la opción -limit

    Al hacerlo, Image Magick creará un archivo temporal para el manejo de imágenes tan pronto como se excedan los límites de memoria dados. Esto necesita permiso de escritura para Image Magick en el directorio de archivos temporales. Podemos dar cualquier ruta donde se creará el archivo temporal en una variable de entorno MAGICK_TMPDIR. Un comando de ejemplo puede ser similar a esto:

        env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    Trabajar en el disco en lugar de en la RAM reducirá considerablemente la velocidad de procesamiento.

  2. Trabajar con "Archivos de disco mapeados en memoria"

    La creación de archivos MPC requiere recursos, pero no necesita tantos recursos para convertir archivos MPC. Por lo tanto, se puede tener en cuenta en caso de que necesitemos convertir la misma fuente con diferentes parámetros varias veces. El flujo de trabajo puede ser similar a este:

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. Trabaja en pequeñas secciones de una imagen usando stream

    El uso de stream afirma que solo procesa una parte de la imagen de origen sin la necesidad de cargar toda la imagen en la memoria.

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    En el ejemplo anterior, la -extractopción toma los valores de tamaño y desplazamiento según lo definido por la geometría de Image Magick . Tendremos que volver a unir los mosaicos para obtener la imagen a escala en su conjunto. Desafortunadamente, la transmisión no funciona para todos los formatos de imagen, pero se supone que funciona bien en imágenes JPEG.

Takkat
fuente