ImageMagick konvertieren und wenig RAM

12

Bitte beachten Sie den folgenden Befehl für das imagemagick-Paket:

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

Jetzt test1.jpgist ein ziemlich großes Image (12,5 MB), aber es ist nicht unerhört groß, aber der Server, auf dem ich arbeite, hat nur 1 GB Speicher ( Amazon EC2 t2.micro, wenn es hilft)

Es wird kein Fehler ausgegeben, und es wird noch kein Fehler test2.jpgerstellt. Ich habe dies mit kleineren Bildern getestet und es funktioniert gut. Ich hätte gedacht, 1G, wenn Speicher genug wäre, um eine Größenänderung zu verwalten, aber vielleicht nicht?

Welche Möglichkeiten habe ich, muss ich mehr Speicher bekommen oder vermisse ich etwas?

Anregungen sind sehr willkommen!

Angeforderte Änderungen

Die Ausgabe von strace zeigt: +++ killed by SIGKILL +++zusammen mit vielen Befehlen, die normal aussehen (Öffnen /usr/share/localund Lesen langer Zeichenfolgen, von denen ich annehme , dass es sich um Bilddaten handelt)

kostenlos gibt mir:

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

Es sieht also so aus, als ob Swap nicht aktiviert ist. Daher werde ich versuchen, eine Swap-Datei zu erstellen, um festzustellen, ob dies meine Probleme löst.

Datei gibt mir:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Ich würde auch das vollständige / path / to / img einfügen, aber leider enthält es vertrauliche Daten (Client-E-Mail-Adressen usw.)

Aphire
quelle
1
Warum verwenden Sie sudodiesen Befehl?
Charles Green
1
Ich habe die Nachricht "Killed" erhalten, als ich es nicht
getan
3
Ypu kann versuchen, den für den Pixel-Cache verwendeten Speicher mit dem Argument zu begrenzen -limit memory 64MiB(32 MB sind wahrscheinlich ein bisschen zu klein. Standard ist 1,5 GB). Und es sollte Ihnen eine beschreibende Ausgabe geben, falls es fehlschlägt.
Dadexix86
2
Versuchen Sie, den Befehl mit straceangehängtem Text vor dem Befehl auszuführen, und überprüfen Sie, welche Systemaufrufe und Fehler ausgegeben werden. Lassen Sie es uns wissen
Sergiy Kolodyazhnyy
2
Erledigt. Ich bin froh, dass du es gelöst hast! Die kostenlose Ausgabe bestätigt, dass Swap deaktiviert ist, und die Dateiinformationen bestätigen, dass es sich nicht um eine falsch identifizierte Datei handelt. Nizza bearbeiten! +1
Elder Geek

Antworten:

7

Ich gehe davon aus, dass Ihnen der Arbeitsspeicher ausgeht. Sie können dies überprüfen, watch cat /proc/meminfowährend Ihr Prozess ausgeführt wird.

Möglicherweise verfügen Sie nicht über genügend RAM und / oder SWAP, um Ihre Aufgabe auszuführen.

swapon -aStellen Sie aufgrund des Zustands mit niedrigem Arbeitsspeicher sicher , dass Swap aktiviert ist. Wenn auf dem System kein Swap eingerichtet ist, erstellen Sie eine Partition für Swap auf nicht verwendetem Speicherplatz und aktivieren Sie sie. Dies wird wahrscheinlich das Problem lösen. Es gibt eine gute Antwort von @Takkat, wie man das hier macht. Wenn Sie keinen Zugriff auf die Partitionierung des Servers haben, können Sie auch eine Swap-Datei für den Swap verwenden

Elder Geek
quelle
1
OP handelt von einem Cloud-Server. Das Erstellen einer Swap-Partition ist möglicherweise keine Option. Sie können hinzufügen, wie auch eine neue Auslagerungsdatei hinzugefügt wird.
user.dz
@ Snetsher Das ist genau das, was ich getan habe, guter Kommentar
Aphire
@ Snetsher "OP handelt von einem Cloud-Server" war (zumindest für mich) aus den Daten in der Frage nicht klar, aber Sie machen einen guten Punkt. Bearbeitungsantwort.
Elder Geek
@ElderGeek, eigentlich ist es aber nicht gut hervorgehoben Amazon EC2 t2.micro, ich habe Frage bearbeitet, um klar zu machen, Tag hinzugefügt, um einfach mit anderen verwandten Fragen verknüpft zu werden.
user.dz
@ Snetsher Ich sehe das jetzt. Vielen Dank für Ihre Bemühungen!
Elder Geek
5

Das Problem in der Frage wurde durch Hinzufügen eines geeigneten Swap behoben. Der Vollständigkeit halber möchte ich eine Zusammenfassung der zusätzlichen Optionen geben, die wir haben, wenn Image Magick convertfür große Dateien auf Systemen mit geringem Arbeitsspeicher ausgeführt wird oder wenn kein Swap verfügbar ist oder der Swap zu klein war.

Die im Folgenden genannten Methoden werden im Image Magick-Handbuch ausführlich erläutert:

Wirklich massive Bildverarbeitung


Zusammenfassung:

  1. Begrenzen Sie die Speichernutzung mit der Option -limit

    Auf diese Weise erstellt Image Magick eine temporäre Datei für die Bildbearbeitung, sobald die angegebenen Speichergrenzen überschritten wurden. Dies erfordert Schreibrechte für Image Magick im temporären Dateiverzeichnis. Wir können einen beliebigen Pfad angeben, in dem die temporäre Datei in einer Umgebungsvariablen erstellt wird MAGICK_TMPDIR. Ein Beispielbefehl könnte ungefähr so ​​aussehen:

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

    Wenn Sie nicht im RAM, sondern auf der Festplatte arbeiten, wird die Verarbeitungsgeschwindigkeit erheblich verlangsamt.

  2. Arbeiten mit "Memory Mapped Disk Files"

    Das Erstellen von MPC-Dateien ist ressourcenintensiv, erfordert jedoch nicht so viele Ressourcen zum Konvertieren von MPC-Dateien. Daher kann dies in Betracht gezogen werden, wenn dieselbe Quelle mehrmals mit unterschiedlichen Parametern konvertiert werden muss. Der Workflow könnte dann ungefähr so ​​aussehen:

    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. Bearbeiten Sie kleine Bildausschnitte mit stream

    Durch die Verwendung von Stream- Ansprüchen wird nur ein Teil des Quellbilds verarbeitet, ohne dass das gesamte Bild in den Speicher geladen werden muss.

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

    Im obigen Beispiel werden für die -extractOption Größen- und Versatzwerte verwendet, die in der Image Magick- Geometrie definiert sind . Wir müssen die Kacheln wieder zusammenkleben, um das skalierte Bild als Ganzes zu erhalten. Leider funktioniert der Stream nicht für alle Bildformate, sollte aber bei JPEG-Bildern einwandfrei funktionieren.

Takkat
quelle