Thread Perl Speicherprobleme mit großen Dateien (W32 Version) (31 answers)
Opened by Mapache at 2009-05-05 14:38

Mapache
 2009-05-06 08:25
#121265 #121265
User since
2009-05-05
8 Artikel
BenutzerIn

user image
Ich habe versucht, ihn das was er da als überlange Zeile liest, ausgeben zu lassen. Er soll mir $data ausgeben, wenn er die Schleife mehr als 10000 Mail durchläuft und keinen Zeilentrenner findet. Dann müsste er mir doch eine ewig lange Zeile ausgeben, oder?

Code (perl): (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
while(!$fh->eof())
{
  $line='';
  # Daten einlesen solange kein "\n" oder "\r" kommt
  # overflow couter
  my $oc = 0;
  while(index($data,"\x0A") < 0  && index($data,"\x0D") < 0 && $oc < 1000)
  {
    $fh->read($buff,1024); # anpassen wenn es zu langsam ist...
    $data.=$buff;
    $oc++;
    if ( $oc gt 10000 ) {
      print "Overflow detected at line $count:\n";
      print $data."\n";
      print $buff."\n";
    }
  }
  # erste Zeile Heraussplitten ("\n" und "\r") gehen verloren
  # das läuft solange wie $data noch Newlines enthalten
  # das "split" ist recht langsam, mit "index" und "substr" währe es schneller
  ($line,$data)=split(/[\x0A\x0D]+/,$data,2);
  #print $line."\n\n";
  #working($line);
  $count++;
  if ( ! ( $count % 10000 ) ) { print "$count lines done\n"; }

}


Es kommt aber nur folgendes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1630000 lines done
1640000 lines done
1650000 lines done
1660000 lines done
1670000 lines done
1680000 lines done
1690000 lines done
Overflow detected at line 1695136:
Apr 27 09:08:32 abc12_ab0.abc.intra.abc-firm.com auditd: Apr 27 07:08:32 2009 UTC f_http_proxy a_libproxycommon t_nettraffic p_major pid: 3060 ruid: 0 euid: 0 pgid: 3060 logid: 0 cmd: 'httpp' domain: htpp edomain: htpp hostname: abc1.abc.intra.abc-f

Overflow detected at line 1695136:
Apr 27 09:08:32 abc12_ab0.abc.intra.abc-firm.com auditd: Apr 27 07:08:32 2009 UTC f_http_proxy a_libproxycommon t_nettraffic p_major pid: 3060 ruid: 0 euid: 0 pgid: 3060 logid: 0 cmd: 'httpp' domain: htpp edomain: htpp hostname: abc1.abc.intra.abc-f

Overflow detected at line 1695136:
Apr 27 09:08:32 abc12_ab0.abc.intra.abc-firm.com auditd: Apr 27 07:08:32 2009 UTC f_http_proxy a_libproxycommon t_nettraffic p_major pid: 3060 ruid: 0 euid: 0 pgid: 3060 logid: 0 cmd: 'httpp' domain: htpp edomain: htpp hostname: abc1.abc.intra.abc-f

Overflow detected at line 1695136:
Apr 27 09:08:32 abc12_ab0.abc.intra.abc-firm.com auditd: Apr 27 07:08:32 2009 UTC f_http_proxy a_libproxycommon t_nettraffic p_major pid: 3060 ruid: 0 euid: 0 pgid: 3060 logid: 0 cmd: 'httpp' domain: htpp edomain: htpp hostname: abc1.abc.intra.abc-f

Overflow detected at line 1695136:
Apr 27 09:08:32 abc12_ab0.abc.intra.abc-firm.com auditd: Apr 27 07:08:32 2009 UTC f_http_proxy a_libproxycommon t_nettraffic p_major pid: 3060 ruid: 0 euid: 0 pgid: 3060 logid: 0 cmd: 'httpp' domain: htpp edomain: htpp hostname: abc1.abc.intra.abc-f


Wie könnt ich denn sagen wir die ersten 10000 Zeichen der Zeile 1695135 und 1695136 einlesen und ausgeben?

View full thread Perl Speicherprobleme mit großen Dateien (W32 Version)