c ++ - Hurtigste måde at læse en tekstfil af strings line for line

Indlæg af Hanne Mølgaard Plasc

Problem




   Mulig duplikat:

  Hvad er den hurtigste metode til højtydende sekventiel fil I/O i C ++?





Jeg har kigget lidt rundt, og jeg er stadig ikke sikker på svaret på dette spørgsmål.


Når du læser fra en tekstfil med et vilkårlig ord på hver linje, hvad ville det være den absolutte hurtigste måde at læse ordene fra den pågældende fil? Omfanget af projektet kræver den hurtigste mulige fillæsning.


Brug af Visual Studio på Windows 7. Ingen krydsplatform overvejelse.


Redigere:
Husk, denne fillæsning er en gangs ting, den bliver ikke læst fra igen, og den bliver ikke skrevet til. Programmet starter, læser fra filen, skubber det ind i en datastruktur, og funktionen loadFile () kaldes aldrig igen.

Bedste reference


Da jeg forstår dit spørgsmål, er dit mål at læse en fil med ord og indsætte hvert ord i en datastruktur. Du vil have denne læsning + indsættelse for at være så hurtig som muligt. (Jeg vil ikke diskutere begrundelsen for eller visdom af dette, jeg accepterer bare, er som et krav. :-))
Hvis min forståelse er korrekt, så vil måske en alternativ tilgang være at skrive et hjælpeprogram, der vil læse filen af ​​ord, indsætte dem i datastrukturen og derefter serialisere datastrukturen til en fil (f.eks. BLOB.dat, for eksempel ). Derefter vil dit hovedprogram deserialisere BLOB.dat til den datastruktur, du har brug for. I det væsentlige forbereder du ordfilen i et mellemliggende binært format, som kan indlæses i din datastruktur mest effektivt. Eller ville det være at snyde i dit scenario ??

Andre referencer 1


Det faktum, at du har denne tagget 'multithreading' får mig til at tro, at du overvejer en gevindskrevet læsning på filen. Jeg anbefaler virkelig dig at genoverveje, da dette vil medføre meget hårde samtidighedsproblemer for at bageste deres grimme hoveder. Du bliver nødt til at dykke dybt ind i kaninhullet i mutexes, semaforer og interprocess kommunikation, hvilket kan gøre selv de bedste udviklere græder i de gode gamle dage før tråde.


Du har en .txt-fil, og du har ord i den fil, der skal læses. Du skal åbne filen, og du skal læse hvert ord. Der er bare ingen at komme rundt om. Medmindre du er villig til at behandle tekstfilen i en datastruktur, der er lavet til samtidig adgang (intel TBB har nogle gode), er det din bedste chance at bare lave en enkelt-tråds læsning og pass data til andre tråde efter alt er lokalt.

Andre referencer 2


Enten hukommelse - kortlæg filen eller læs den i store bitstørrelser med stor størrelse og behandle dataene i hukommelsen.

Andre referencer 3


Gør ikke hukommelseskort filen. Som Raymond Chen forklarer, dræber det den sekventielle adgangsoptimering. Da diske er langsomme, vil prefetching holde disken optaget og dermed gennemstrømningen højere. [2]

Andre referencer 4


Din fil vil sandsynligvis indlæse sig selv så hurtigt som det er i stand til. Efter alle de fleste filoperationer kalder man kun de samme systemopkald. IOstreams siges at være langsommere end cstdio, men jeg foreslår at du bruger et profileringsværktøj her for at finde det bedste sæt af muligheder her. Tweak buffer størrelse for at matche dit behov. Men desværre med store filer det meste du vil bruge på at vente på IO, bruges kun en lille tid til behandling. Tweaking hvordan du laster vandt 't købe dig meget.


Men da du skal vente, skal du sørge for at bruge din tid klogt.


Sprøjt en tråd for at indlæse filen straks, når applikationen starter, og brug den tid til at gøre noget andet. Hvis du har brug for dataene til at gøre noget, skal du sende klumper af læsefilen til den anden tråd, der skal behandles.