ImageMagick converter e baixa RAM

12

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 bastante grande (12,5 MB), mas não tem tamanho inédito, mas o servidor no qual estou trabalhando tem apenas 1 G de memória ( Amazon EC2 t2.micro, se ajudar)

Nenhum erro está sendo lançado e ainda não test2.jpgestá sendo criado. Eu testei isso com imagens menores e funciona bem. Eu teria pensado 1G se a memória seria suficiente para gerenciar um redimensionamento, mas talvez não?

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

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

Edições solicitadas

strace output shows: +++ killed by SIGKILL +++junto com vários comandos que parecem normais (abrindo /usr/share/locale lendo longas strings, que eu assumo 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, portanto, vou criar um arquivo de troca para ver se isso classifica meus problemas.

O arquivo me fornece:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Gostaria também de colar o / path / to / img completo, mas infelizmente ele contém dados confidenciais (endereços de e-mail do cliente etc.)

Aphire
fonte
1
Por que você está usando sudoeste comando?
Charles Green
1
Recebi a mensagem "Matado" quando não
recebi
3
O Ypu pode tentar limitar a memória usada para o cache de pixels com o argumento -limit memory 64MiB(32MiB é um pouco pequeno provavelmente. O padrão é 1.5GiB). E deve fornecer uma saída descritiva, caso falhe.
precisa saber é o seguinte
2
Tente executar o comando straceanexado na frente do comando, veja quais chamadas do sistema são feitas, erros gerados. Deixe-nos saber #
Sergiy Kolodyazhnyy
2
Feito. Estou feliz que você tenha resolvido! a saída livre confirma que a troca está desativada e as informações do arquivo confirmam que não é um arquivo mal identificado. Nice edit! 1
Elder Geek

Respostas:

7

Estou assumindo que você está ficando sem memória RAM. Você pode verificar isso watch cat /proc/meminfoenquanto seu processo estiver em execução.

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

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

Elder Geek
fonte
1
OP é sobre um servidor em nuvem, a criação de uma partição de troca pode não ser uma opção. Você também pode adicionar Como adicionar um novo arquivo de troca .
user.dz
@Sneetsher Isso é exatamente o que eu fiz, bom comentário
Aphire
@Sneetsher "O OP é sobre um servidor em nuvem" não estava claro (pelo menos para mim) dos dados da pergunta, mas você faz um bom argumento. resposta de edição.
Elder Geek
@ElderGeek, na verdade, mas não está bem destacado Amazon EC2 t2.micro, editei a pergunta para deixar clara a tag adicionada também para facilitar a vinculação a outras questões relacionadas.
precisa saber é
@ Sneetsher eu vejo isso agora. Obrigado por seus esforços!
Elder Geek
5

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

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

Manipulação de imagem realmente massiva


Resumo:

  1. Limitar 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 especificados 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 em que o arquivo temporário será criado em uma variável de ambiente MAGICK_TMPDIR. Um comando de exemplo 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. Trabalhar com "Arquivos de disco mapeados na memória"

    Criar arquivos MPC exige muitos recursos, mas não precisa de muitos recursos para converter de arquivos MPC. Portanto, isso 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 stream declarações de para processar apenas uma parte da imagem de origem sem a necessidade de carregar toda a imagem 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 -extractopção aceita valores de tamanho e deslocamento, conforme definido pela geometria da Image Magick . Teremos que juntar os ladrilhos novamente para obter a imagem em escala como um todo. Infelizmente, o fluxo não funciona para todos os formatos de imagem, mas deve funcionar bem em imagens JPEG.

Takkat
fonte