Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5953[/thread]

Performance: Was kann ich verbessern?



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Rambo
 2003-12-05 22:47
#74706 #74706
User since
2003-08-14
803 Artikel
BenutzerIn

user image
Hallo zusammen,

ich habe folgendes Script welches mir im Inhalt von Zip dateien nach einem Sting sucht. Leider kann der Inhalt bis zu 20 MB an text Daten enthalten was natürlich etwas dauert.
kann ich hier etwas besseres machen?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use Archive::Zip; 
use Archive::Zip::MemberRead;
use File::Glob ':glob';

#****************************
# Search String
#****************************
print "\n\nPls. Enter Search String!\n\n";
chomp ($String = <STDIN>);
print "\nSearching for String $String ........\n\nPls. wait!\n\n";

#****************************
# Search over all ZIP Files
#****************************
@Zip_File = glob ("*.zip");
for $Zip_File (@Zip_File){

#****************************
#
#****************************
$zip = new Archive::Zip($Zip_File);

#****************************
# Files to be read
#****************************
@file2 = qw (PIXX_SRV_LF5.LOG
PIXX_SRV_LF5.LOG.1
);
for $file2 (@file2){

#****************************
# Open Zip Archive for
# reading Files
#****************************
$fh = new Archive::Zip::MemberRead($zip, $file2);

#****************************
# Line number call for
# Search String
#****************************
$zeile = 0;
while (defined($line = $fh->getline())) {
chomp($line);
++$zeile;
if ($line =~ /$String/) {
print "\nFound in Line $zeile: Search String\n$line\nin ZipFile $Zip_File\nLog File $file2\n\n";
}
}
$fh->close();
}
}
print "\n\nSearch for String $String Done!";

später soll hier noch eine Gui drum rum deshalb möchte ich erst mal diesen Teil so gut wie möglich haben

danke schon mal
Strat
 2003-12-06 15:17
#74707 #74707
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
1. verwende use strict; und use warnings; , weil dir ersteres gerade bei groesseren Projekten viele moegliche Fehlerquellen ausschaltet und zweiteres auf sie hinweist. Und dann zusaetzlich lokale Variablen verwenden (z.B.:
Code: (dl )
1
2
3
4
5
6
for my $Zip_File (@Zip_File){
...
my $zip = new Archive::Zip($Zip_File);
...
while (defined(my $line = $fh->getline())) {
...

)
2. Vielleicht, wenn vorhanden, optional externe Programme verwenden (z.B. gzip), weil die meistens schneller sind. Dann hat man eine reine Perl-Loesung, die unter so gut wie allen Betriebssystemen laeuft, und zusaetzlich die Option, es (vielleicht ueber eine Konfigurationsdatei) performanter zu machen.

3. koennte dir eine Fehlerabfrage an Stellen, wo was schiefgehen kann, viel Fehlersuche bei sogenannten Akte-X-Phaenomenen hilfreich sein, z.B. nach $zip = new Archive::Zip(...); Was passiert da, wenn die Datei nicht lesbar ist? oder defekt?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Rambo
 2003-12-06 18:02
#74708 #74708
User since
2003-08-14
803 Artikel
BenutzerIn

user image
Hallo,

Danke erstmal für die vorschläge!
zu 1.
habe bis das script soweit war use strict, warnings und dignostics verwendet es aber jetzt erstmal wieder raus genommen weil ich es in eine EXE konvertiert habe und dann probleme damit gehabt dignostics einzubinden weil er das modul nicht gefunden hat :-) Benutze aber in der Regel sehr gerne diese Warianten zumindest bis es läuft!

zu 2.
das habe ich noch nicht probiert mit externen Zip Programmen zu arbeiten. Ansich gefällt mir das Zip von Perl sehr gut weil es integriert ist und ich es auch für das Packen dieser Datein auf dem Server benutze :-)
Problem sehe ich das ja nicht jeder Winzip oder so hat únd hiermit bin ich unabhängig ob es jemand hat oder nicht :-)
werde aber mal ein Test machen ob es performance bringt.

zu 3.
ja das klingt gut man kann nie wissen ob es hier problem geben kann das habe ich noch nicht bedacht!

Allerdings weis nicht wie ich das dann in einer Gui hinbekomme die ich mit TK machen wollte. Da kenne ich micht noch nicht so aus wie man hier Meldungen auf den Schirm bekommt (Zip Datei nicht lesbar) oder so.

Danke schon mal für die Hinweise
Strat
 2003-12-06 20:25
#74709 #74709
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
1. nur weil der packer diagnostics nicht findet, brauchst du nicht strict und warnings gleich mitdeaktiveren; perl ist eine aeusserst maechtige waffe, und ohne strict und warnings oft fuer den programierer ziemlich gefaehrlich. Nebenbei: mit CPAN:PAR (frei) oder perl2exe (kommerziell) kannst du deine Perl-Scripte zu exe-Dateien zusammenpacken, und die muessten beide diagnostics finden (von PAR weiss ich es)

2. ich meinte nicht, dass du dich 100% auf externe packer verlassen sollst (das meinte ich mit optional), sondern beide wege implementieren koenntest, also wenn da z.B. gzip installiert ist, dass du es dann verwendest, aber wenn nicht, dann halt Perl-interne Mittel verwenden (vielleicht ueber eine Konfigurationsdatei einstellbar: exe und parameter)

3. Entweder mit einem Fensterchen, das aufpoppt (z.B. mit CPAN:Tk::messageBox, oder du gibst es in einem Textfeld aus, oder was auch immer, ich kenne deine Anwendung nicht)

[edit]habe mal die nachricht mit den smileys geloescht, weil die absolut sinnlos ist[/edit]\n\n

<!--EDIT|Strat|1070735377-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2003-12-06 22:36
#74710 #74710
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,06.12.2003, 19:25]Nebenbei: mit CPAN:PAR (frei) oder perl2exe (kommerziell) kannst du deine Perl-Scripte zu exe-Dateien zusammenpacken, und die muessten beide diagnostics finden (von PAR weiss ich es)[/quote]
hmm, crian hatte vor kurzem probleme damit, dass diagnostics einen fehler
produzierte (unter windows). vielleicht könnt ihr euch da ja mal austauschen...
unter linux funktioniert es.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2003-12-07 14:38
#74711 #74711
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
sonst einfach dem autor schreiben; der hat mir auch schon sehr geholfen, als ich mal bei Tk mit den .al-Dateien Probleme hatte
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2003-12-08 15:44
#74712 #74712
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Auf die Ursprungsfrage zurueckkehrend: ist "unzip -p zipfile | grep string" um Groessenordnungen schneller als deine Perl-Version? Wenn nicht, dann kann man auch in der Perl-Version nichts schneller machen.

Ein paar Dinge kann man vielleicht trotzdem tunen. Du verwendest eine variable Regexp:
if ($line =~ /$String/) {
Mit Einfuegen des Modifiers /o wird die Regexp einmalig compiliert und sollte dadurch schneller ausgefuehrt werden. Aber Achtung! Du kannst diesen Modifier nicht verwenden, wenn sich $String aendern sollte. Um das zu umgehen, muesste man die gesamte Schleife in ein eval "" packen.

Du verwendest getline. Evtl. ist es etwas schneller, wenn du in groesseren Bloecken einliest (4K oder 8K) oder gar die ganze Datei. Man muss dann beim Match aufpassen, wenn man sich gerade an der Blockgrenze befindet.
Crian
 2003-12-08 16:32
#74713 #74713
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Um nochmal zum "Zwischengeplänkel" zurückzukommen: perl2exe hat in der Tat Probleme mit "use diagnostics;".

Ich bin aber "with a little help of your friends" zu der Ansicht gelangt, dass use diagnostics in einem "fertigen" Programm eh nichts mehr zu suchen hat, und konnte das Problem so durch Auskommentieren dieser einen Zeile "elegant" umschiffen :D
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2003-12-08 17:42
#74714 #74714
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@crian: achso, ich dachte, du sprichst von PAR.

ich verwende diagnostics nie, weil mir das zuviel quasselt; warnings und strict sagt mir doch schon alles, was ich brauche
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2003-12-08 18:08
#74715 #74715
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich hab mit beidem herumexperimentiert und mir daraufhin use diagnostics wieder abgewöhnt (das Gesabbel nervte inzwischen auch, am Anfang war es noch hilfreich...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2003-12-05 22:47.