Avatar billede ruma1974 Nybegynder
18. maj 2009 - 11:17 Der er 8 kommentarer og
1 løsning

Læse et bestemt antal bytes af en file

Hej,

Jeg læser et bestemt antal bytes af en stor file med nedenstaaende kode. Problemet er at det virker som seek scanner fra starten a filen indtil mit index I1. Er det muligt at lave denne kode hurtigere?

assignfile(SpecRawFile,filename);
reset(SpecRawFile);
seek(SpecRawFile,I1);
I:=I1;
while (I<=I2) and (not eof(SpecRawFile))) do
    begin
    read(SpecRawFile,temp);
    ..min kode
    Inc(I);
    end;

Her indikere I1 og I2 hvor file skal læses.

Mvh,

Rune
Avatar billede a_nor Nybegynder
18. maj 2009 - 11:49 #1
Seek går umiddelbart til den position man ønsker, så det kan nok ikke gå stærkere.


Læser du kun en byte af gangen ?

Du skal nok anvende BlockRead i stedet for Read, så kan du få læst 'klumper' efter eget valg.
Avatar billede a_nor Nybegynder
18. maj 2009 - 11:51 #2
Nu fik du ikke skrevet hvad din file består af (text, formatterede eller uformatterede data...), men blockread kan altid bruges  :-)
Avatar billede ruma1974 Nybegynder
18. maj 2009 - 12:16 #3
Tak, mine data er i en record array.

type Massrecordtype=record
    Mass,int:double;
    ch:smallint;
    reten:real;
    end;

Det er meget intressant da jeg fandt en note der siger at blockread er mere effektiv en read. Så hvis jeg kan bruge blockread paa min record ville det vaerre smart.
Avatar billede a_nor Nybegynder
18. maj 2009 - 13:20 #4
Så kunne du evt. gøre således:

var a_Mass: array[1..100] of MassRecordType;
    I_read:integer;  // antal faktisk læste records

....

blockread(SpecRawFile,a_mass,100,i_read)
Avatar billede ruma1974 Nybegynder
18. maj 2009 - 14:05 #5
Jeg får desærre I/O 998 error med ovenstående

Hvilket betyder: Invalid access to memory location.

Jeg sætter a_mass dynamisk og jeg får fjelen selv hvis jeg sætter størrelsen af a_mass noget større end det antal records som jeg læser.
Avatar billede a_nor Nybegynder
18. maj 2009 - 14:16 #6
Arrayet må vist ikke oprettes lokalt, da det herved foregår på stakken, og hermed i "omvendt" orden.

Prøv at bruge global variabel inden du bruger GetMem eller New til at skaffe plads til arrayet.
Avatar billede ruma1974 Nybegynder
18. maj 2009 - 14:42 #7
Takker for hjælpen det løser problemet. Hvis du lægger et svar giver jeg point.
Avatar billede a_nor Nybegynder
18. maj 2009 - 14:47 #8
Hvor meget hjalp det på dit hastighedsproblem ??
Avatar billede ruma1974 Nybegynder
18. maj 2009 - 15:01 #9
Det hjalp en hel del (2-3 sekunder per array) da hver array har en størrelse på 100000.

Typisk skal jeg læse 2000-3000 gange så en god forbedring.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester