2009-11-03 12 views

Antwort

5

Wenn Sie die binären unzip ausführen, Ihr Prozess fork/exec wird und

  1. instanziiert ein neues Verfahren
  2. mehr Speicher verbrauchen (für die Dauer des erzeugten Prozesses)

Sie muss auch mit dem korrekten Pfad zu unzip konfiguriert werden. Angesichts all dessen würde ich den Ansatz der Bibliothek bevorzugen.

+3

Ich verstehe diese Art des Denkens nie. Ein fork/exec ist ein sehr schneller Prozess, jeder, der Zeit damit verbringt, Shell-Skripte zu lesen oder zu schreiben, ist sich dessen bewusst. Der von der Unzip-Binärdatei selbst verbrauchte Speicher ist im Vergleich zu den Kosten des Algorithmus und (insbesondere) der darin enthaltenen Daten trivial. Und/usr/bin/unzip wird standardmäßig auf jeder Linux-Distribution ausgeliefert, und ich glaube auch an BSDs und Cygwin. Wenn Sie keinen Beispielcode haben, der so trivial ist wie: 'öffne meine $ input, 'entpacke -cp $ ARCHIVE $ FILE |" ', würde ich die einfache Option bevorzugen. –

+1

Obwohl ich mit dem oben genannten * im Allgemeinen * einverstanden bin, wenn Sie einen stark ausgelasteten Server haben, steigt Ihr Ressourcenverbrauch mit dem fork/exec-Modell. Die PID-Zuweisung, die Inter-Prozess-Stream-Zuweisung, die Speicherzuweisung (ermöglicht das Kopieren-beim-Schreiben). Für eigenständige Prozesse bin ich mit dem fork/exec-Modell zufrieden. Bei Servermodellen scheue ich mich vor dem Modell mit der geringsten Ressourcenallokation zurück. –

+1

Wenn Sie sich in einer Schleife, insbesondere in einer Hot-Loop-Funktion, verzweigen, werden Sie absolut Leistungsprobleme feststellen. Wenn Sie nicht in einer Schleife sind oder wenn Sie nur einmal pro Sekunde oder einmal alle paar Sekunden forschen, dann ist das kein Problem. Auch die Verwendung einer Bibliothek anstelle des Befehls zum Entpacken des Systems kann von Vorteil sein. Die Bibliothek könnte neuer und weniger fehlerhaft sein. –

14

Nach dem Archive::Zip documentation würden Sie besser dran Archive::Extract Verwendung sein:

Wenn Sie nur Extrahieren Reißverschlüsse sein werden (und/oder andere Archive) wird Ihnen empfohlen, zu prüfen, Archive mit :: Extract Stattdessen ist es einfacher zu verwenden und filtert archivspezifische Funktionen aus.

Das ist interessant, weil Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. So scheint es, dass Archive :: Zip die bevorzugte Option ist.

Archive :: Zip verwendet Compress::Raw::Zlib, die eine Low-Level-Schnittstelle zur zlib-Systembibliothek ist; Es handelt sich also nicht um eine reine Perl-Implementierung, was bedeutet, dass die Leistung der unzip ähnlich ist. Mit anderen Worten, aus Performance-Sicht gibt es keinen Grund, unzip vor Archive :: Zip zu wählen.

+3

Wenn Sie Archive :: Extract verwenden, funktioniert es auch für andere Komprimierungsformate. –

1

Ein Anliegen ist mit Speicher. Wir haben den harten Weg gefunden (Produktionsserver abgestürzt), dass Archive::Tar ein Speicherleck hatte. Während also die Verwendung eines Moduls anstelle eines Systemaufrufs zu einem externen Befehl eine gute Idee ist (siehe andere Antworten für Argumentation), müssen Sie sicherstellen, dass das Modul keine Probleme hat.