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:
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!
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:
Fügen Sie -monitor
als erstes Befehlszeilenargument hinzu, um weitere Details zu den Vorgängen zu erhalten.
(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"
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 ...
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.
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.
Tags und Links image linux image-processing imagemagick imagemagick-convert