Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Optimizacija citanja tekstualnih fajlova sa diska

[es] :: C/C++ programiranje :: Optimizacija citanja tekstualnih fajlova sa diska

[ Pregleda: 1827 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

miksin

Član broj: 41918
Poruke: 98
*.dynamic.sbb.co.yu.



Profil

icon Optimizacija citanja tekstualnih fajlova sa diska26.04.2007. u 14:39 - pre 206 meseci
Trebam da prebacim podatke iz tekstualnog fajla u jedan memo radi dalje obrade, ali problem je sto taj tekstualni fajl ima 5000+ redova

ja sam koristio sledeci kod:

Code:
ifstream Baza;
Baza.open("Baza.xml",ios::in);
int i;
char string[150];
Memo1->Clear();
for(i=0;i<5000;i++){
        Baza.getline(string,149);
        Memo1->Lines->Add(string);
        if(Memo1->Lines->IndexOf("</Disc>")!=-1) {
                brojac=i;
                break;
        }
}


Ali ucitavanje traje izmedju 50 i 60 sekundi sto je puno.
A posto meni ne treba da ucitavam liniju po liniju, predpostavljam da bi islo brze ako bih koristio neku drugu funkciju, a ne getline(). Idealno bi bilo da postoji funkcija koja celokupan text iz fajla prebacuje u memo. Da li takvo nesto postoji?
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.dsl.iskon.hr.



+9 Profil

icon Re: Optimizacija citanja tekstualnih fajlova sa diska26.04.2007. u 14:48 - pre 206 meseci
Memo1->Lines->LoadFromFile("nekifajl.txt");

iako za rad s većim datotekama svakako preporučujem korištenje RichEdit-a...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Optimizacija citanja tekstualnih fajlova sa diska26.04.2007. u 21:54 - pre 206 meseci
Ne znam šta tačno podrazumevaš pod optimizacijom, ali u tvom slučaju deo koda:
Citat:

Code:

if(Memo1->Lines->IndexOf("</Disc>")!=-1) {
        brojac=i;
        break;
}


... je jako loš.

Koliko vidim ti hoćeš da prekineš upis kada naiđeš na "</Disc>". U tvom primeru, korišćenje
IndexOf() metode inicira ponovnu pretragu od prve do poslednje linije, iako si već proveravao
prethodne linije. To je jako veliki gubitak i otuda toliko utrošeno vreme.

Taj deo koda zameni na primer ovim /netestirano/:
Code:

if ( Memo1->Lines->Strings[i].AnsiPos( "</Disc>" ) != 0 )
{
   brojac=i;
   break;
}


Dalje, ukoliko ti je potrebno da neki fajl učitaš u NE-VIZUELNU kontrolu radi lakše naknadne pretrage
i sl, možeš upotrebiti i TStringList klasu:

Code:

TStringList *SL = new TStringList;
SL->LoadFromFile( /* neki fajl */ );

// ovde možeš po želji da prrolaziš kroz listu, modifikuješ, brišeš i sl.

delete SL;

... i kasnije to možeš da pridružiš nekom TMemo objektu na način koji ti je već poznat u prethodnom
tvom pitanju.

Dalje, velika količina Add()-ova u TMemo objekat takođe može da 'jede' vreme. Tada se koristi:

Code:

Memo1->BeginUpdate();

// ovde tvoja petlja koja dodaje linije...

Memo1->EndUpdate();

ili još bolje /malo modernije i sigurnije/:
Code:

--- H ---
class RAII_MemoEditLock
{
private:
   TMemo *ME;
public:

   RAII_MemoEditLock( TMemo *me ) : ME( me )
   {
      if ( ME )
         ME->Lines->BeginUpdate();
   }

   ~RAII_MemoEditLock()
   {
      if ( ME )
         ME->Lines->EndUpdate();
   }
};

--- CPP ---
void TForm1::FunkcijaKojaDodajeLinije()
{
   RAII_MemoEditLock Lock( Memo1 );

   // ovde tvoja petlja koja dodaje linije...

}

 
Odgovor na temu

miksin

Član broj: 41918
Poruke: 98
*.dynamic.sbb.co.yu.



Profil

icon Re: Optimizacija citanja tekstualnih fajlova sa diska27.04.2007. u 14:46 - pre 206 meseci
@itf to je odradilo posao. Ucita ga za 1 sekund. Hvala.
@X Files hvala na super objasnjenju, sad mi je mnogo jasnije
Kad sam pisao kod nisam znao za Strings[] tako da mi je IndexOf() jedino pao na pamet, sad kapiram tacno sta IndexOf() radi.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Optimizacija citanja tekstualnih fajlova sa diska

[ Pregleda: 1827 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.