Thread grosse (1GB) binäre Dateien komplett auswerten (8 answers)
Opened by Gast at 2004-08-19 13:07

Gast Gast
 2004-08-19 13:07
#49414 #49414
Hi,

habe ZeitPerformance-Problem mit folgendem Code

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
####################Anfang##############
#!/usr/local/bin/perl

use strict;

################################################################################
#Initialisierung
my (@botschaften_gesamt);

################################################################################
#main-Routine
print "\n\n ----------- Start --------- \n\n";

read_in();
process();

print "\n\n ----------- Ende  --------- \n\n";

################################################################################
sub read_in
{
   my ($botschaft_bin) = "\x00" x 16;
   my ($path_in) = shift @ARGV;

   open (FILE, "$path_in") or die $!;
   binmode (FILE);

   #es genügt den Cursor einmal in der Datei zu setzen
   seek (FILE, 1024, 0);

   until (substr($botschaft_bin,0,5) eq "\xFF" x 5 &&    $botschaft_bin ne "\xFF" x 16)
{

       ######################################################################
  #Einlesen einer Botschaft des cco.files -> i.O.
    read (FILE, $botschaft_bin, 16);

  ######################################################################
  #in der Botschaftsstruktur abspeichern
       push (@botschaften_gesamt, $botschaft_bin);

  }
close (FILE);
}
################################################################################
sub process
{
   my (@botschaft_process);

   #print
   mkdir "./result";
open Gelb, ">./result/gelb01.asc"; open Gruen, ">./result/gruen01.asc"; open Blau, ">./result/blau01.asc";
   
my ($kanal);
   my (%hash) = ("01",*Gelb , "02",*Gruen , "04",*Blau);


foreach (@botschaften_gesamt)
{
       #binäre Darstellung in hexadezimale wandeln
    $_ = unpack ("H32", $_);

    #Botschaft in ihre Elemente mittels unpack zerlegen
@botschaft_process = unpack("A10 A2 A20", $_);

    #alle CAN-Kanaele können durchlaufen werden
       foreach $kanal(keys(%hash))
       {
        if ($botschaft_process[1] eq $kanal)
        {
               printf {$hash{$kanal}} " %16s %1s  %20s \n", $botschaft_process[0],$botschaft_process[1],$botschaft_process[2];
            last;
        }
       }
       #Leeren des Feldes durch Freigeben des Elements
    $_ = undef;
   }
   close Gelb; close Gruen; close Blau;
}
######################################################Ende##########################


damit lese ich gesamte Datei in den Speicher (array) - 1.Mal komplett durch die Daten wandern
2.Mal wandern passiert bei Wandeln der binären Daten und nach Kriterium ausgeben an verschiedene FILEHANDLES

Wo liegt Potential zum beschleunigen???

Danke

Roger

Bearbeitet von Crian: CODE-Tags hinzugefügt\n\n

<!--EDIT|Crian|1092906861-->

View full thread grosse (1GB) binäre Dateien komplett auswerten