Converti ImageMagick e RAM bassa


12

Si prega di considerare il seguente comando per il pacchetto imagemagick:

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

Ora test1.jpgè un'immagine abbastanza grande (12,5 MB), ma non di dimensioni inaudite, ma il server da cui sto lavorando ha solo 1G di memoria ( Amazon EC2 t2.micro se aiuta)

Non viene generato alcun errore e tuttavia non test2.jpgviene creato. Ho provato questo con immagini più piccole e funziona benissimo. Avrei pensato 1G se la memoria fosse sufficiente per gestire un ridimensionamento, ma forse no?

Quali sono le mie opzioni, devo avere più memoria o mi sto perdendo qualcosa?

Tutti i suggerimenti sono i benvenuti!

Modifiche richieste

mostra l'output di strace: +++ killed by SIGKILL +++insieme a molti comandi che sembrano normali (apertura /usr/share/locale lettura di stringhe lunghe, che presumo siano dati di immagine)

gratis mi dà:

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

Quindi sembra che lo swap non sia abilitato, quindi esaminerò la creazione di un file di scambio per vedere se questo risolve i miei problemi.

Il file mi dà:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Vorrei anche incollare l'intero / percorso / in / img ma sfortunatamente contiene dati sensibili (indirizzi e-mail client ecc.)


1
Perché stai usando sudoin questo comando?
Charles Green,

1
Ricevuto il messaggio "Ucciso" quando non l'ho fatto
Aphire il

3
Ypu può provare a limitare la memoria utilizzata per la cache di pixel con l'argomento -limit memory 64MiB(probabilmente 32 MB è un po 'troppo piccolo. L'impostazione predefinita è 1,5 KiB). E dovrebbe darti un output descrittivo nel caso fallisca.
dadexix86,

2
Prova a eseguire il comando con l' straceaggiunta di fronte al comando, vedi quali chiamate di sistema vengono effettuate, errori generati. Facci sapere
Sergiy Kolodyazhnyy il

2
Fatto. Sono contento che tu l'abbia risolto! l'output gratuito conferma che lo scambio è disattivato e le informazioni sul file confermano che non si tratta di un file erroneamente identificato. Bella modifica! +1
Elder Geek,

Risposte:


7

Suppongo che stai esaurendo la RAM. Puoi verificarlo con watch cat /proc/meminfomentre il processo è in esecuzione.

Potresti avere RAM e / o SWAP insufficienti per svolgere il tuo compito.

A causa della condizione low-ram, assicurarsi che lo swap sia attivo swapon -ae, se non è stato impostato alcuno swap sul sistema, creare una partizione per lo swap su spazio su disco inutilizzato e abilitarlo. Questo probabilmente risolverà il problema. C'è una buona risposta di @Takkat su come farlo qui Se non hai accesso al partizionamento del server puoi anche usare un file di scambio per lo scambio


1
OP riguarda un server cloud, la creazione di una partizione di swap potrebbe non essere un'opzione. Puoi aggiungere anche Come aggiungere un nuovo file di scambio .
user.dz,

@Sneetsher Questo è esattamente quello che ho fatto, buon commento
Aphire

@Sneetsher "OP riguarda un server cloud" non era chiaro (almeno per me) dai dati nella domanda, ma hai ragione. modifica della risposta.
Anziano Geek,

@ElderGeek, in realtà non è ben evidenziato Amazon EC2 t2.micro, ho modificato la domanda per chiarire, ho aggiunto anche il tag per essere facilmente collegato ad altre domande correlate.
user.dz,

@Sneetsher Lo vedo ora. Grazie per i tuoi sforzi!
Anziano Geek,

5

Il problema nella domanda è stato risolto aggiungendo lo swap appropriato. Per completezza, consentitemi di fornire un riepilogo delle opzioni aggiuntive disponibili quando eseguiamo Image Magick convertsu file di grandi dimensioni su sistemi con memoria insufficiente o quando non è disponibile alcuno scambio o lo scambio era troppo piccolo.

I metodi menzionati di seguito sono elaborati in dettaglio nel manuale di Image Magick:

Gestione delle immagini davvero massiccia


Sommario:

  1. Limita l'utilizzo della memoria con l'opzione -limit

    In questo modo Image Magick creerà un file temporaneo per la gestione delle immagini non appena i limiti di memoria indicati verranno superati. Ciò richiede l'autorizzazione di scrittura per Image Magick nella directory dei file temporanei. Possiamo fornire qualsiasi percorso in cui il file temporaneo verrà creato in una variabile di ambiente MAGICK_TMPDIR. Un comando di esempio potrebbe essere simile al seguente:

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

    Lavorare su disco piuttosto che su RAM rallenta notevolmente la velocità di elaborazione.

  2. Lavorare con "File su disco mappati in memoria"

    La creazione di file MPC richiede risorse, ma non ha bisogno di così tante risorse per la conversione da file MPC. Pertanto può essere preso in considerazione nel caso in cui abbiamo bisogno di convertire più volte la stessa fonte con parametri diversi. Il flusso di lavoro potrebbe quindi essere simile a questo:

    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. Lavora su piccole sezioni di un'immagine usando stream

    L'uso delle dichiarazioni di flusso per elaborare solo una parte dell'immagine di origine senza la necessità di caricare l'intera immagine in memoria.

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

    Nell'esempio sopra, l' -extractopzione accetta i valori di dimensione e offset definiti dalla geometria Image Magick . Dovremo incollare nuovamente le tessere per ottenere l'immagine ridimensionata nel suo insieme. Sfortunatamente lo stream non funziona per tutti i formati di immagine ma dovrebbe funzionare bene su immagini JPEG.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.