Nabend, betrifft Perl. Mittels Archive::Tar erzeuge ich tar.gz-Archive. 20 Minuten gehts ohne Probleme, dann kommt das Skript aber in die Situation, in der es ein Archiv aus 5 Dateien mit zusammen 65 MB erzeugen soll. In diesen Sekunden schwillt /proc/loadavg auf über 6 an, in /var/log/messages erscheint ein einfacher Hinweis a la "highmem: empty", und das Skript bricht ab, und hoppla, "Getötet" steht in der letzten Zeile. (Letzteres ist keine Ausgabe des Skriptes.) Der Rechner hat aber ca. 350 MB Arbeitsspeicher. Außer dem Skript laufen keinerlei andere Anwendungsprogramme. (Nur Gnome.) Weiß jemand was man da tun kann? LG, Ralph PS: Ich bin hier von qx{/bin/tar ...} auf Archive::Tar umgestiegen, weil es vorher andere Probleme gab: Manche Archivdateien wurden aus unerfindlichen Gründen nur dann erzeugt, wenn ich Pausen (sleep) eingebaut hatte, was aber nicht der Weisheit letzter Schluß sein kann.
Hallo, Am Son, 11 Jun 2006, Ralph Müller schrieb:
Mittels Archive::Tar erzeuge ich tar.gz-Archive. 20 Minuten gehts ohne Probleme, dann kommt das Skript aber in die Situation, in der es ein Archiv aus 5 Dateien mit zusammen 65 MB erzeugen soll. In diesen Sekunden schwillt /proc/loadavg auf über 6 an, in /var/log/messages erscheint ein einfacher Hinweis a la "highmem: empty", und das Skript bricht ab, und hoppla, "Getötet" steht in der letzten Zeile. (Letzteres ist keine Ausgabe des Skriptes.)
Zeig mal her wie du Archive::Tar verwendest. -dnh --
aalib? libcaca? -- J. Walzer Wer kommt auf die Idee, seine Libraries nach menschlichen Exkrementen (und dazu noch in zwei verschiedenen Sprachen) zu bennenen? -- C. Eineke
Am Montag, den 12.06.2006, 15:42 +0200 schrieb David Haller:
Am Son, 11 Jun 2006, Ralph Müller schrieb:
Mittels Archive::Tar erzeuge ich tar.gz-Archive. 20 Minuten gehts ohne Probleme, dann kommt das Skript aber in die Situation, in der es ein Archiv aus 5 Dateien mit zusammen 65 MB erzeugen soll. In diesen Sekunden schwillt /proc/loadavg auf über 6 an, in /var/log/messages erscheint ein einfacher Hinweis a la "highmem: empty", und das Skript bricht ab, und hoppla, "Getötet" steht in der letzten Zeile. (Letzteres ist keine Ausgabe des Skriptes.)
Zeig mal her wie du Archive::Tar verwendest.
Konzentriert auf das Problem sieht das so aus: #!/usr/bin/perl use File::Find; use Archive::Tar; $tar = Archive::Tar->new(); find ({wanted => \&scan, postprocess => \&compress}, "/tmp"); sub scan { if (-f) { print "Sammele Datei \"$File::Find::name\" ein.\n"; $tar->add_files($File::Find::name); } } sub compress { $tar->write("/tmp/backup.tgz",1); # Archiv auf Festplatte schreiben } exit; Irgendwie scheint Archive::Tar eine andere (ressourcenfressendere) Arbeitsmethode zu benutzen als /bin/tar, weil bei /bin/tar tritt _dieses_ Problem nicht auf. Meine vorherige "Lösung" mit /bin/tar sah übrigens im Prinzip so aus: $stdErr = qx{tar -c -z -f "/tmp/backup.tgz" datei1.txt datei2.txt datei3.txt 2>&1 1>/dev/null}; Wenn man File::Find über mehrere Verzeichnisse iterieren läßt und pro Verzeichnis eine Datei backup.tgz generieren läßt, funktioniert /bin/tar nur dann zuverlässig, wenn ich eine Pause (sleep) von 2-3 Sekunden zwischen einzelnen qx-Befehlen (Verzeichnissen) einbaue. (Ansonsten wird ohne Fehlermeldung einfach die ein oder andere Datei backup.tgz ausgelassen.) Daher vermute ich vielleicht die etwas zu langsame Festplatte als Fehlerursache? Hmm, ich probiere gleich mal aus ob es mit Archive::Tar geht wenn ich (viel) mehr Swap zur Verfügung stelle. Immerhin hätte ich dann eine Gewißheit, daß es an der Speichergröße liegt bzw. an den Speicheranforderungen von Archive::Tar. (Ist auf jeden Fall ärgerlich.) LG, Ralph
Hallo, Am Montag, 12. Juni 2006 23:36 schrieb Ralph Müller: [...]
Irgendwie scheint Archive::Tar eine andere (ressourcenfressendere) Arbeitsmethode zu benutzen als /bin/tar, weil bei /bin/tar tritt _dieses_ Problem nicht auf.
man Archive::Tar 'Isn't Archive::Tar heavier on memory than /bin/tar? Yes it is, see previous answer. Since "Compress::Zlib" and therefore "IO::Zlib" doesn't support "seek" on their filehandles, there is little choice but to read the archive into memory. This is ok if you want to do in-memory manipulation of the archive. If you just want to extract, use the "extract_archive" class method instead. It will optimize and write to disk immediately."' Ferdinand -- Change is the essential process of all existence. -- Spock, "Let That Be Your Last Battlefield", stardate 5730.2
Hallo, Am Die, 13 Jun 2006, Ferdinand Ihringer schrieb:
Am Montag, 12. Juni 2006 23:36 schrieb Ralph Müller: [...]
Irgendwie scheint Archive::Tar eine andere (ressourcenfressendere) Arbeitsmethode zu benutzen als /bin/tar, weil bei /bin/tar tritt _dieses_ Problem nicht auf.
man Archive::Tar
'Isn't Archive::Tar heavier on memory than /bin/tar? Yes it is, see previous answer. Since "Compress::Zlib" and therefore "IO::Zlib" doesn't support "seek" on their filehandles, there is little choice but to read the archive into memory. This is ok if you want to do in-memory manipulation of the archive. If you just want to extract, use the "extract_archive" class method instead. It will optimize and write to disk immediately."'
Archive::TarGzip scheint dies nicht zu machen. ==== use Archive::TarGzip; my @files; sub scan { -f && push(@files, $File::Find::name); } sub compress { Archive::TarGzip->tar( @files, { tar_file => "/tmp/backup.tar.gz", compress => 1 } ) or die "$!\n"; } @files = undef; find( { wanted => \&scan, postprocess => \&compress }, "/tmp"); ==== Oder irgendwie so. Es kann Probleme geben mit: 1. compress als postprocess: "postprocess" The value should be a code reference. It is invoked just before leaving the currently processed directory. D.h. compress wird auch fuer jedes Unterverzeichnis aufgerufen! 2. Das Archiv wird ins einzupackende Verzeichnis /tmp geschrieben. Das solltest du passend aendern. Z.B. so: ==== #!/usr/bin/perl -w use strict; use Archive::TarGzip; my @files; sub scan { -f && push(@files, $File::Find::name); } @files = undef; find( { wanted => \&scan }, "/tmp"); Archive::TarGzip->tar( @files, { tar_file => "/tmp/backup.tar.gz", compress => 1 } ) or die "$!\n"; ==== Alles ungetestet! -dnh -- 17: Vollkompatibel zur Datenautobahn Gerät verfügt über eine serielle Schnittstelle. (Peter Berlich)
participants (3)
-
David Haller
-
Ferdinand Ihringer
-
Ralph Müller