ImageMagick: Wie erreicht man eine geringe Speichernutzung bei der Größenänderung einer großen Anzahl von Bilddateien?

8

Ich möchte eine große Anzahl (etwa 5200) von Bilddateien (PPM-Format, jeweils 5 MB groß) verkleinern und sie mit convert im PNG-Format speichern.

Kurzversion:

convert lässt 24 GB Speicher explodieren, obwohl ich die Syntax verwende, die convert anweist, Bilddateien nacheinander zu verarbeiten.

Lange Version:

Wenn ich mehr als 25 GB Bilddaten betrachte, sollte ich nicht alle Dateien gleichzeitig verarbeiten. Ich habe die ImageMagick-Dokumentation über die fortlaufende Verarbeitung von Bilddateien durchsucht und gefunden :

  

Es ist schneller und weniger ressourcenintensiv, die Größe jedes einzelnen Bildes zu ändern   lesen:

     

$ convert '*.jpg[120x120]' thumbnail%03d.png

Auch erklärt das Lernprogramm :

  

Zum Beispiel statt ...

     

montage '*.tiff' -geometry 100x100+5+5 -frame 4 index.jpg

     

liest zuerst alle Tiff-Dateien ein und ändert dann die Größe. Sie können   stattdessen tun ...

     

montage '*.tiff[100x100]' -geometry 100x100+5+5 -frame 4 index.jpg

     

Dadurch wird jedes Bild eingelesen und die Größe geändert, bevor Sie fortfahren   das nächste Bild. Dies führt zu weit weniger Speicherverbrauch und möglicherweise   Verhindern des Plattenwechsels (Thrashing), wenn Speichergrenzen erreicht sind.

Daher mache ich das gerade:

%Vor%

Laut den Dokumenten sollte jede Bilddatei einzeln behandelt werden: Lesen, Größe ändern, schreiben. Ich mache das auf einer Maschine mit 12 echten Kernen und 24 GB RAM. In den ersten zwei Minuten steigt die Speicherauslastung des Prozesses convert jedoch auf etwa 96%. Es bleibt eine Weile dort. CPU-Auslastung ist maximal. Ein bisschen länger und der Prozess stirbt, nur zu sagen:

  

getötet

Zu diesem Zeitpunkt wurden keine Ausgabedateien erstellt. Ich bin auf Ubuntu 10.04 und convert --version sagt:

%Vor%

Es sieht so aus, als ob convert versucht, alle Daten zu lesen, bevor die Konvertierung gestartet wird. Entweder gibt es einen Fehler in convert , ein Problem mit der Dokumentation oder ich habe die Dokumentation nicht richtig gelesen.

Was ist los? Wie kann ich bei der Größenanpassung dieser großen Anzahl von Bilddateien einen geringen Speicherverbrauch erreichen?

Übrigens: Eine schnelle Lösung wäre, einfach die Dateien mit der Shell zu durchlaufen und convert für jede Datei unabhängig aufzurufen. Aber ich würde gerne verstehen, wie man das gleiche mit reinem ImageMagick erreicht.

Danke!

    
Jan-Philip Gehrcke 10.09.2012, 13:18
quelle

3 Antworten

5

Ohne direkten Zugriff auf Ihr System ist es wirklich schwierig, Ihnen beim Debuggen zu helfen.

Aber Sie können drei Dinge tun, um dieses Problem einzugrenzen:

  1. Fügen Sie -monitor als erstes Befehlszeilenargument hinzu, um weitere Details zu den Vorgängen zu erhalten.

  2. (Optional) fügen Sie -debug all -log "domain: %d +++ event: %e +++ function: %f +++ line: %l +++ module: %m +++ processID: %p +++ realCPUtime: %r +++ wallclocktime: %t +++ userCPUtime: %u \n\r"

  3. hinzu
  4. Verwenden Sie vorübergehend kein '* .ppm [1280x1280]' als Argument, sondern stattdessen 'a * .ppm [1280x1280]'. Der Zweck besteht darin, Ihre Wildcard-Erweiterung (oder eine andere geeignete Methode, um dasselbe zu erreichen) auf nur einige Übereinstimmungen anstatt aller möglichen Übereinstimmungen zu beschränken.

Wenn Sie "2." du musst '3' machen außerdem wirst du von der Masse der Produktion überwältigt sein. (Ihr System scheint auch nicht in der Lage zu sein, die volle Wildcard trotzdem zu verarbeiten, ohne den Prozess zu beenden ...)

Wenn Sie keine Lösung finden, dann ...

  1. ... einen Benutzernamen unter dem offiziellen ImageMagick-Fehlerbericht-Forum .
  2. ... melden Sie Ihr Problem dort, um zu sehen, ob sie Ihnen helfen können (diese Leute sind eher freundlich und reagieren freundlich, wenn Sie höflich fragen).
Kurt Pfeifle 10.09.2012, 21:18
quelle
2

Es ist das gleiche Problem, anscheinend weil ImageMagick temporäre Dateien im Verzeichnis / tmp erstellt, das oft als tmpfs angehängt wird.

Bewege deinen tmp einfach woanders hin.

Zum Beispiel:

  • Erstellen Sie ein "tmp" -Verzeichnis auf einem großen externen Laufwerk

    mkdir -m777 /media/huge_device/tmp

  • Stellen Sie sicher, dass die Berechtigungen auf 777 festgelegt sind

    chmod 777 /media/huge_device/tmp

  • als root, mount es als Ersatz für Ihre / tmp

    mount -o bind /media/huge_device/tmp /tmp

Hinweis: Es sollte möglich sein, mit der TMP-Umgebungsvariablen denselben Trick zu verwenden.

    
Cecile 27.09.2013 16:50
quelle
0

Ich würde mit GNU Parallel gehen, wenn Sie 12 Kerne haben - so etwas, das sehr gut funktioniert. Da nur 12 Bilder gleichzeitig gespeichert werden und die Nummer der Ausgabedatei erhalten bleibt, wird nur minimaler Arbeitsspeicher benötigt.

%Vor%

Hinweise

Mit

-scene können Sie den Szenenzähler einstellen, der in Ihrem %05d -Teil erscheint.

--eta sagt voraus, wann Ihre Arbeit erledigt wird (geschätzte Ankunftszeit).

-j 12 führt 12 Jobs gleichzeitig parallel aus.

    
Mark Setchell 09.10.2015 22:52
quelle