Avatar billede gulbaek Nybegynder
17. november 2004 - 13:54 Der er 9 kommentarer og
1 løsning

Indlæsning af meget stor text fil, optil 400 MB

Hejsa, har brug for lidt forslag til hvordan jeg mest optimalt læser en text fil ind i mit program. Problemet er som følger.

Jeg har nogle txt filer af forskellig størrelse fra et par MB og helt op til 400MB. Ligenu læser jeg dem ind ved hjælp af en StreamReader og benytter mig af ReadLine(), men vil mene det ikke er særlig optimalt til de store filer.

Kender godt til ReadToEnd, men den er udelukket pga. de store filer, jeg tænker mere på at bruge readBlock(), men kan ikke helt finde udaf hvordan den skal benyttes, har søgt på nettet efter brugbare eksempler.
Avatar billede arne_v Ekspert
17. november 2004 - 14:23 #1
Jeg har aldrig brugt den, men jeg er da ikke i tvivl om hvordan jeg
ville prøve at bruge den:

char[] ca = new char[100000];
int n;
while((n = sr.ReadBlock(ca, 0, ca.Length)) >= 0)
{
  // ca[0 .. n-1] kan processes
}

og den skal nok være hurtigere end ReadLine.

Men jeg har en grim mistanke om at det du sparer sætter du til når du skal
til at processe det ubekvemme char array.
Avatar billede gulbaek Nybegynder
17. november 2004 - 14:50 #2
Hmm, ja det havde været smartest hvis den smed en string retur da det er dem jeg arbejder på og analysere.

Det må vel være muligt at læse en del at en txt fil og få en streng retur, for som du selv siger så risikere jeg at skulle bruge en masse tid på at kører det array igennem, ellers er jeg nødtil at lave min kode om så den arbejder på char array
Avatar billede gulbaek Nybegynder
17. november 2004 - 14:51 #3
hmm, måske jeg skulle lave det om, læser alligevel strengen tegn efter tegn og sammenligner med det jeg tidligere har læst.
Avatar billede gulbaek Nybegynder
17. november 2004 - 16:39 #4
arne_v har siddet og arbejdet lidt på dit eksempel, men den går i en evig løkke når den når til sidste del af min txt fil.

StreamReader sr = new StreamReader("c:\\Test.txt");
            char[] ca = new char[100];
            int n;

            while((n = sr.ReadBlock(ca, 0, ca.Length)) >= 0)
            {
                for(int i = 0; ca.Length > i;i++)
                    Console.Write(ca[i]);
            }
Avatar billede arne_v Ekspert
17. november 2004 - 16:40 #5
Prøv > fremfor >=
Avatar billede gulbaek Nybegynder
17. november 2004 - 16:44 #6
hehe ups, den burde jeg have opdaget :-), men smid lige et svar
Avatar billede arne_v Ekspert
17. november 2004 - 16:45 #7
kommer her
Avatar billede gulbaek Nybegynder
17. november 2004 - 16:57 #8
og Takker for hjælpen, ca blir dog ikke tømt hver gang man kører sr.ReadBlock, hvilket kan give lidt problemer sidst i strengen, men det finder jeg nok en løsning på.
Avatar billede arne_v Ekspert
17. november 2004 - 17:12 #9
sidste valide char er ca[n-1]
Avatar billede gulbaek Nybegynder
17. november 2004 - 17:26 #10
nå, smart nok, så det var ligefrem gennemtænkt :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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