Font
[thread]8459[/thread]

foreach in array: Foreach in array Probleme Folgedurchlauf

Reader: 1


<< >> 8 entries, 1 page
nick_ch
 2006-10-30 17:31
#71258 #71258
User since
2006-10-30
2 articles
BenutzerIn
[default_avatar]
Das folgende Skript soll drei Logfiles von 120MB grösse einlesen. Der Erstdurchlauf dauert 1Minute, Folgedurchläufe bleiben bei @AnalyseLines=<READLOG>; rund 20 minuten hängen. Die Prozessorauslastung während dieser Zeit ist bei rund 98%. Kann mir da jemand weiterhelfen?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl -w
#
use strict;

my $pathinput="D:\\WebLogs\\import\\";
my $filesinput="*.log";

my @filelist = glob($pathinput.$filesinput);
foreach my $AnalyseFile (@filelist) {
print $AnalyseFile , "\n";

open(READLOG,$AnalyseFile) || die("Cannot Open File");


my@AnalyseLines=<READLOG>; Code:
Original - my@AnalyseLines=<READLOG>; Code
my@AnalyseLines=<READLOG>;

my @AnalyseLines=<READLOG>;

close(READLOG);
}
\n\n

<!--EDIT|renee|1162225484-->
Taulmarill
 2006-10-30 17:53
#71259 #71259
User since
2004-02-19
1750 articles
BenutzerIn

user image
evtl. reicht es schon, wenn du die recht großen files nicht komplett in einen array einliesst, sondern sie über eine while schleife a&´la while ( my $line = <READLOG> ) { code ... } bearbeitest
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2006-10-30 18:27
#71260 #71260
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Oder mit CPAN:Tie::File arbeiten...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2006-10-30 21:59
#71261 #71261
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
[quote=renee,30.10.2006, 17:27]Oder mit CPAN:Tie::File arbeiten...[/quote]
Bei großen Dateien würde ich darauf verzichten, weil Tie::File einen großen Overhead hat.
nick_ch
 2006-10-31 08:34
#71262 #71262
User since
2006-10-30
2 articles
BenutzerIn
[default_avatar]
Mit dem Zeilenweise einlesen funktioniert es. Besten Dank für den Lösungsansatz. :cool:

Da ich immer eine Zeile vor und eine Zeile nach der Hauptzeitle analysieren muss, wird es etwas komplizierter, da ich vorher jede Zeile mit der Nr ansprechen konnte.
Taulmarill
 2006-10-31 14:31
#71263 #71263
User since
2004-02-19
1750 articles
BenutzerIn

user image
du kannst ja drei zeilen in einem array vorhalten und dann immer mit shift eine wegschmeissen und mit push die neue hinzufügen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sid burn
 2006-10-31 15:35
#71264 #71264
User since
2006-03-29
1520 articles
BenutzerIn

user image
Oder Tie::File benutzen.

Mich würde Interessieren welchen Overhead "ptk" meint. Gerade bei großen Dateien, und wenn man es immer noch so bequem wie ein Array bearbeiten möchte, sehe ich doch gerade den Vorteil von Tie::File?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
ptk
 2006-10-31 21:44
#71265 #71265
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Ich bin ein gebranntes Kind. Naiverweise habe ich vor einigen Jahren Tie::File zur Logfile-Analyse verwendet, und es war sehr langsam. In meinem Fall war es viel besser, File::ReadBackwards zu verwenden, weil ich rückwärts von hinten nur einen Teil des Logfiles einlesen musste.

Aber das war noch perl 5.8.0 und eine ältere Version von Tie::File. Jetzt habe ich ein paar kurze Tests gemacht und nichts Schlimmes festgestellt; auch ein großes Logfile war blitzschnell eingelesen (aber vielleicht ist auch nur mein jetziger Rechner besser und größer).

Tie::File hat seine Stärken, wenn man frei innerhalb einer Datei springen will, oder wenn man etwas ändern und in die gleiche Datei zurückschreiben will, womöglich sogar Zeilen einfügen oder löschen. Ansonsten ist man aber mit einer einfachen while (<$fh>) {-Schleife besser bedient; es ist nicht komplizierter hinzuschreiben und auf jeden Fall resourcenschonender.
<< >> 8 entries, 1 page



View all threads created 2006-10-30 17:31.