ImageMagick converter e baixa RAM

11

Por favor considere o seguinte comando para o pacote imagemagick:

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

Agora, test1.jpg é uma imagem razoavelmente grande (12,5MB), mas não inédita de tamanhos, mas o servidor do qual estou trabalhando tem apenas 1G de memória (Amazon EC2 t2.micro se ajuda)

Nenhum erro está sendo gerado e, no entanto, nenhum test2.jpg está sendo criado. Eu testei isso com imagens menores e funciona bem. Eu teria pensado 1G se a memória fosse suficiente para gerenciar um redimensionamento, mas talvez não?

Quais são minhas opções, tenho que conseguir mais memória ou estou perdendo alguma coisa?

Todas as sugestões são muito bem vindas!

Edições solicitadas

A saída strace

mostra: +++ killed by SIGKILL +++ junto com um monte de comandos que parecem normais (abrindo /usr/share/local e lendo strings longas, que eu suponho serem dados de imagem)

grátis me dá:

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

Portanto, parece que a troca não está ativada, então vou procurar criar um arquivo de swap para ver se isso classifica meus problemas.

O arquivo me dá:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Também colo o diretório / path / to / img mas infelizmente ele contém dados confidenciais (endereços de e-mail do cliente, etc.)

    
por Aphire 22.01.2016 / 17:57

2 respostas

7

Estou assumindo que você está ficando sem RAM. Você pode verificar isso com watch cat /proc/meminfo enquanto seu processo está em execução.

Você pode ter RAM e / ou SWAP insuficientes para realizar sua tarefa.

Devido à condição low-ram, assegure-se de que a troca esteja ativada com swapon -a e, se nenhuma troca estiver configurada no sistema, crie uma partição para swap em um espaço em disco não utilizado e habilite-a. Isso provavelmente resolverá o problema. Há uma boa resposta do @Takkat sobre como fazer isso aqui Se você não tem acesso ao particionamento do servidor, você também pode usar um swapfile para swap

    
por Elder Geek 26.01.2016 / 20:08
4

O problema na questão foi resolvido adicionando-se a troca apropriada. Para completar, deixe-me dar um resumo das opções adicionais que temos ao executar o Image Magick convert em arquivos enormes em sistemas com pouca memória, ou quando não há swap disponível, ou o swap era muito pequeno.

Os métodos mencionados abaixo são detalhados no manual Image Magick:

Manipulação de imagem realmente massiva

Resumo:

  1. Limite o uso de memória com a opção -limit

    Ao fazer isso, o Image Magick criará um arquivo temporário para manipulação de imagens assim que os limites de memória fornecidos forem excedidos. Isso precisa de permissão de gravação para o Image Magick no diretório de arquivos temporários. Podemos fornecer qualquer caminho onde o arquivo temporário será criado em uma variável de ambiente MAGICK_TMPDIR . Um exemplo de comando pode ser semelhante a este:

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

    Trabalhar no disco, e não na RAM, diminuirá consideravelmente a velocidade de processamento.

  2. Trabalhe com "Arquivos de disco de memória mapeada"

    A criação de arquivos MPC exige recursos, mas não precisa de tantos recursos para converter arquivos MPC. Portanto, pode ser levado em consideração no caso de precisarmos converter a mesma fonte com parâmetros diferentes várias vezes. O fluxo de trabalho pode ser semelhante 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. Trabalhe em pequenas seções de uma imagem usando stream

    Usando declarações stream para processar apenas uma parte da imagem de origem sem a necessidade de carregar a imagem inteira na memória.

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

    No exemplo acima, a opção -extract obtém valores de tamanho e deslocamento, conforme definido pelo Image Magick geometria . Teremos que juntar os ladrilhos para obter a imagem dimensionada como um todo. Infelizmente stream não funciona para todos os formatos de imagem, mas deve funcionar bem em imagens JPEG.

por Takkat 28.01.2016 / 19:54