d3ns007
Goto Top

Welche Parameter muss ich in einer Batch setzen um beim zippen die compression sowie die Geschwindigkeit zu definieren?

Hallo ich möchte mit 7zip ein paar Dateien komprimieren. Und das funktioniert soweit auch ganz gut. Nur dauert das zippen zu lange und deswegen muss ich das Script etwas optimieren.

Ich hab folgenden Quelltext:

@echo off & setlocal
set "source=D:\SOURCEPATH"  
set "dest=F:\DESTPATH"  
set "ext=mda"  

for %%i in ("%source%\*.%ext%") do (  
set dupe=
echo Vergleiche %%i
if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul && set dupe=true  
if not defined dupe copy "%%i" "%dest%"  
)
REM Verbliebene Dateien kopieren
del "%source%\*.%ext%"  


Pushd "%dest%"  
For /F "Delims=" %%A in ('Dir /B/A-D "%dest%\*.%ext%"') Do call :ZipIt "%%~fA"  
Popdrem
Del "%dest%\*.%ext%"   
Goto :Eof
:ZipIt
Set "Zip=%~n1"  
Set "Zip=%archive%%Zip:~0,9%.zip"  
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1  


Ich habe schon nach Anregungen im I-Net gesucht und auch schon etwas gefunden.
Nämlich : -m{Parameters}: set compression Method

Aber jetzt weiß ich nicht wo ich das in mein Quellcode packe und was ich in die Klammern schreibe wo "Parameters" steht.

Könnt Ihr mir helfen?

Mile Grazie

Content-ID: 128291

Url: https://administrator.de/contentid/128291

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

Iwan
Iwan 30.10.2009 um 11:18:43 Uhr
Goto Top
hallo,

warum nutzt du nicht einfach die Hilfe von 7-Zip selber?
in der Hilfedatei unter
  • Command Line Version -> Switches -> -m (Set compression Method) switch
ist alles aufgeführt, was du wissen möchtest und was du einsetzen kannst
D3ns007
D3ns007 30.10.2009 um 11:52:07 Uhr
Goto Top
Ahh sehr gut. Danke

Hab es gefunden.
ich teste das mal.
D3ns007
D3ns007 30.10.2009 um 14:02:55 Uhr
Goto Top
Also, ich habe an den bisherigen Quellcode in der 24ten Zeile die Parameter -mx1 angehängt.
Das ganze bringt mir eine verbesserung um ganze 20 sekunden aber verschlechtert die Kompression auch um 36%.

Könnt Ihr mal bitte über den Quellcode schauen und mir sagen was ich ändern muss um auf unter eine Minute zu kommen?
Bisher braucht das Programm mehr als 4 Minuten um eine Datei zu zippen. Das Problem liegt daran das jede Datei mit allen bisher bestehenden Ziparchiven verglichen werden.

Grüße
bastla
bastla 30.10.2009 um 15:41:26 Uhr
Goto Top
Hallo D3ns!007!

Die Schleife lässt sich zwar auf
for %%i in ("%source%\*.%ext%") do (   
    echo Vergleiche %%i 
    if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul || copy "%%i" "%dest%"   
)
verkürzen, aber ob das viel bringt ... face-wink

Alternativ (je größer die Datei, desto sinnvoller) könntest Du zunächst die Dateigrößen vergleichen und nur bei gleich großen Dateien dann noch zusätzlich den byteweisen Vergleich durchführen:
for %%i in ("%source%\*.%ext%") do (  
    set dupe=
    echo Vergleiche %%i
    for %%v in ("%dest%\%%~nxi") do if "%%~zi"=="%%~zv" fc /b "%%i" "%%~v">nul && set dupe=true  
    if not defined dupe copy "%%i" "%dest%">nul  
)
Grüße
bastla
D3ns007
D3ns007 30.10.2009 um 15:59:21 Uhr
Goto Top
Hy Bastla,
danke für die Nachricht.

Dein Quellcode verkürzt das ganze nur sehr bedingt.
Nachdem eine Datei gezippt wurde und ins Archiev gepackt wurde, sollte sie gelöscht werden.
Das bringt den Vorteil das nicht immer alle Dateien verglichen werden müssen.

Weißt du wie ich das in diesem Quellcoe umsetzen kann?

Grüße

D3ns!007
bastla
bastla 30.10.2009 um 16:27:31 Uhr
Goto Top
Hallo D3ns!007!
Dein Quellcode verkürzt das ganze nur sehr bedingt.
Das hatte ich befürchtet ...
Nachdem eine Datei gezippt wurde und ins Archiev gepackt wurde, sollte sie gelöscht werden.
Soferne 7zip verlässliche Errorlevel liefert, könntest Du die letzte Zeile auf
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 && del %1
ändern ...

Grüße
bastla
D3ns007
D3ns007 30.10.2009 um 16:36:08 Uhr
Goto Top
Also das Kommando macht zwar genau das was ich mir vorgestellt habe aber schneller wird es nicht dadurch. Eher langsamer face-sad
Ich hab das Gefühl das: Je größer das Ziparchiv desto langsamer der Vorgang. Kann man anstatt das ganze Archiv nur den Archivnamen mit dem Dateinamen vergleichen? Das müsste noch viel schneller gehen und das unabhängig davon ob das Archiv groß oder klein ist. Es wäre zwar nicht mehr so resistent gegen redundanzen aber schneller bestimmt.

Nur: Wie geht das???

Völlig überfragt face-sad
bastla
bastla 30.10.2009 um 16:48:01 Uhr
Goto Top
Hallo D3ns!007!
Kann man anstatt das ganze Archiv nur den Archivnamen mit dem Dateinamen vergleichen? Das müsste noch viel schneller gehen und das unabhängig davon ob das Archiv groß oder klein ist. Es wäre zwar nicht mehr so resistent gegen redundanzen aber schneller bestimmt.
Meinst Du das so
if not exist "%dest%\%%~nxi" copy "%%i" "%dest%"
oder so:
if not exist "%Zip%" "C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 || goto :eof  
del %1
Grüße
bastla
Biber
Biber 30.10.2009 um 17:47:49 Uhr
Goto Top
Moin D3ns!007,

wenn irgendein Skript unerwartet und auffällig langsam läuft, dann liegt es nach meinen Beobachtungen sehr selten daran, dass jemand vergessen hat, den Parameter "/Turbo=on" oder ähnliches mitzugeben.
Meistens ist in solchen Fällen irgendwo ein Denkfehler in der Strategie.

lass mich doch noch mal nachfragen:
  • ist Laufwerk F:, das %dest%-Laufwerk. denn auch so schnell wie Laufwerk C:? Oder ist das ein Netzlaufwerk oder ein CDROM-Laufwerk? face-wink
  • welchen Sinn macht es denn für Dich, die Source-.mda-Dateien erst auf F: zu kopieren, dann in ein dortiges Zip zu quetschen und dann zu löschen?
  • Woher um Himmels willen können denn bei dieser Mimik deine so genannten dupes entstehen? Du legst doch für jede jede jede mda-datei auf Lw C: jedes mal ein neues Zip an.
  • und warum, wenn du schon 7Zip benutzt verwendest du das .zip-Format und glaubst, dass die 7-zip-Entwickler sich bei diesem Format mehr Mühe gegeben haben als beim Format ."7z".??

--> ich würde, wenn ich aus irgendwelchen Gründen kein richtiges Versionsverwaltungssystem wie SVN oder CVS benutzen mag
  • einen Refererent-"Source"-Stand auf dem %dest%-Laufwerk liegen lassen (jeweils die aktuellste version der .mda-Datei
  • im ersten Schritt mit "XCOPY /D und Schalter /L" alle Dateien anlisten lassen, die auf C: "neuer" als auf F:\ sind
  • diese Deltaliste a) als "Zip-des-Tages-mit-allen-geänderten Dateien" zippen und auf %dest% in ein Unterverzeichnis %dest%\MdaDeltas packen mit Datum als Präfix
  • diese Delta-Dateien auch 1:1 nach %dest% ins Referenz-MDA_Verzeichnis kopieren
  • am Ende nochmal mit FC vergleichen, ob auf auf C: und F: die gleichen mda's rum- bzw. vorliegen (sollte laut Konzept ja so sein)

Das würde dir zumindest ersparen, jede mda auf F: zu kopieren wie im bisherigen Konzept.

Wenn ich das falsch verstanden habe und auch heute bei dir bei meinetwegen 24 .mda-Dateien auf C: weniger als 24 .zip-Dateien auf F: entstehen, dann muss ich dein Skript wohl nochmal langsamer lesen...

Grüße
Biber
D3ns007
D3ns007 03.11.2009 um 09:12:40 Uhr
Goto Top
Hier das Ergebnis der Quelltextoptimierung:

@echo off & setlocal

rem *************************
rem Author:
rem Changes:
rem 09/11/02
rem *************************

set "source=SOURCE"  
set "dest=DESTINATION"  
set "ext=mda"  

rem Verschieben der Dateien nach ZIEL
rem move /y "%source%\*.%ext%" "%dest%"  

rem Verzeichnis wechseln, für jeden Tag ein Verzeichnis anlegen lassen
Pushd "%dest%"  
	For /F "delims=" %%A in ('Dir /B/A-D "%source%\*.%ext%"') Do (  
		call :FolderIt "%%~fA"  
	)
Popd

goto ZipFolders

Goto :EOF

:FolderIt
Set "Folder=%~n1"  
if not exist "%Folder:~0,9%" (  
	mkdir "%Folder:~0,9%"  
)
MOVE /Y %source%\%Folder%.mda %Folder:~0,9%\%Folder%.mda
goto :EOF


:ZipFolders
Pushd "%dest%"  
	For /F "delims=" %%A in ('Dir /B/AD') Do (  
		call :ZipIt "%%~fA"  
	)
Popd
goto :EOF


:ZipIt
Set "Zip=%~n1"  
Set "Zip=%Zip%.zip"  
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 -mx1  
rmdir /Q /S %1

:EOF


Vielleicht hilft der Code ja jemand anderes weiter.
Viele Grüße
und Danke für die Mühe
Biber
Biber 03.11.2009 um 11:45:18 Uhr
Goto Top
Moin D3ns!007,

danke für das Bereitstellen deines Skripts.

Der Vollständigkeit halber die Frage:
Hat es dein ursprüngliches (Performance-) Problem auch gelindert?
Oder ist da kein Unterschied erkennbar?

Grüße
Biber
D3ns007
D3ns007 03.11.2009 um 11:54:53 Uhr
Goto Top
Moin Biber,

ich hatte das ganze jeweil mit 36 Referen-Dateien getestet.
Bei dem bisherigen Script dauerte ein durchlauf ca. 3.40 min. Durch die optimierung sind wir auf ca. 29 sek. gekommen.
Das bringt natürlich einen großen Vorteil.
Am längsten dauert momentan der Kopiervorgang: Dateien von A nach B zu kopieren und das Updaten der mit 1500 Dateien recht großen Zip-Archiven.

Grüße
D3ns!007