|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Hohe CPU / Pattern
|
Seitenanfang |
Hi ich habe folgendes Problem ich möchte eine Große datei Pattern (50 MB) und bekomme immer eine 100 %tige CPU auslastung was kann man da machen, Script ist für Windows. Hier mein bisheriger Code:
#! /usr/bin/perl# diese Pragmas sollten immer eingesetzt werden! use strict; # siehe perldoc strict use warnings; my $input = 'test.dat'; my $output = 'test1222.dat'; my $pattern1 = "0"; my $ersatz1 = " "; open(IN,"<$input") or die $!; my @lines = <IN>; close IN; open(WRITE,">$output") or die $!; foreach my $line(@lines){ $line =~ s/\Q$pattern1\E/$ersatz1/g; print WRITE $line; } close WRITE;
Datum: 03.01.2006-20:48

|
re: Hohe CPU / Pattern
|
Seitenanfang |
| Hi, ich glaube Dir nicht dass das Skript unter Windows läuft. Nicht mit dem Kompileraufruf. ;-) Nebenbei, 50MB in den Speicher laden ist ganz schön heavy.
#! /usr/bin/perluse strict; use warnings; my $input = 'test.dat'; my $output = 'test1222.dat'; my $pattern1 = "0"; open(IN,"<$input") or die $!; open(WRITE,">$output") or die $!; while(<IN>) { $_ =~ s/\Q$pattern1\E/\s/g; print WRITE $line; } close IN; close WRITE;
-uw
Datum: 03.01.2006-21:07

|
re: Hohe CPU / Pattern
|
Seitenanfang |
Hi, hast du recht ein leerzeichen zuviel und das $ersatz1 vergessen, gibt es denn sonst noch eine Möglichkeit so große dateien zu bearbeiten?
#!/usr/bin/perluse strict; use warnings; my $input = "test.dat"; my $output = 'test1222.dat'; my $pattern1 = "0"; my $ersatz1 = " "; open(IN,"<$input") or die $!; my @lines = <IN>; close IN; open(WRITE,">$output") or die $!; foreach my $line(@lines){ $line =~ s/\Q$pattern1\E/$ersatz1/g; print WRITE $line; } close WRITE;
So sollte es sein ;)
Datum: 03.01.2006-21:13

|
re: Hohe CPU / Pattern
|
Seitenanfang |
| Hi, $ersatz1 habe ich nicht vergessen. Das habe ich absichtlich weggelassen. Und dass ich die geöffnete Datei Zeilenweise verarbeitet habe, das hatte auch seinen Sinn. Theoretisch hätte ich sogar $pattern1 weglassen müssen. 50MB in den Speicher zu laden produziert CPU-Load. Und je mehr Variablen dazu kommen, um so höher wird die Last. Du darfst nicht vergessen, dass das System die Bytes sequenziell durcharbeitet. -uw
Datum: 03.01.2006-21:55

|
re: Hohe CPU / Pattern
|
Seitenanfang |
| Dadurch wird die CPU last auch nicht weniger, gibt es nicht die möglichkeit durch sleep oder Byteweise einlesen die Last zu reduzieren? Oder die date nach und nach einzulesen und zu pattern, falls ja wie könnte so etwa aussehen.
Datum: 03.01.2006-22:31

|
re: Hohe CPU / Pattern
|
Seitenanfang |
| Hallo cyber87, Du kannst natürlich zeilenweises Einlesen und Auswerten versuchen: open(IN,"<$input") or die $!;open(WRITE,">$output") or die $!; foreach my $line(<IN>){ $line =~ s/\Q$pattern1\E/$ersatz1/g; print WRITE $line; } close WRITE; close IN;
Ob's 'was bringt, weiss ich nicht. Ansonsten wäre es einmal interessant, Dein Script mit Deinen Daten auszuprobieren. Hast Du eine Möglichkeit, die irgendwo zum Download zu deponieren? Was sagt denn Dein Taskmanager, welcher Prozeß die ganze CPU verbraucht? Gruß, Michael
Datum: 05.01.2006-18:18

|
|

|

|

|
 |

|

|
|