Ahojte.
Mam problem pri spracovani velkeho CSV suboru. Pri jeho importovani to StringGridu (cca 25000 rekordov) je app zatuhnuta a neda sa s nou pracovat. Taktiez nacitavanie tych dat je strasne zdlhave. Nacitavam to standardnou metodou a tam je na 99% kamen urazu. Potreboval by som poradit ako sa takyto problem riesi profi.
Teoriu mam, thready pre jedntlive rekordy(riadky) a medzi tym obsluha jadra. Ale neviem ako to implementovat.
Nasiel metodu nacitania do pamate (TMemoryStream). Bolo by to riesenie? Potom, ale zas treba percitat riadky, to bude oriesok.
1M subor s 25k rekordami do 1-3s! Predpokladam najrychlejsie by to bolo presunom najprv do pamate (MemoryStrem?) a nasledne do tabulky formou threadov, nech je app stale dostupna (reakcia na uzvatelske vstupy).
Do doho MemoryStreamu to vyzera byt u mna rychle, ale uz presun a zobrazenie je zalostne pomale a hlavne
este k tomu pocas spracovavania udajov nepouzitelne.
Ak sa nemylim, ako by vyzerali tie thready? Bolo by to asi na nazdy nacitany riadok jeden thread. Napr. na riadky 1,3,5 ... thread1 a 2,4,6 ... thread2? Ako by to bolo optimalne? Alebo mam scestne myslienky?
cast klasickeho kodu na spracovanie:
Kód:
var
F1: TextFile;
Tmp: string;
riadok,stlpec: Longint;
AssignFile(F1,OpenDialog1.FileName);
try
Reset(F1);
try
riadok := 1;
while not EoF(F1) do begin
ReadLn(F1,Tmp);
stlpec := 1;
while Pos(',',Tmp) > 0 do begin
StringGrid1.Cells[stlpec,riadok] := Copy(Tmp,1,Pos(',',Tmp)-1);
Delete(Tmp,1,Pos(',',Tmp));
inc(stlpec);
end;
inc(riadok);
StringGrid1.Refresh
end;
finally
CloseFile(F1);
end;
except
on E:EInOutError do
case E.ErrorCode of
2 : ShowMessage('Subor nenajdeny!');
103 : ShowMessage('Subor neotvoreny!');
else
ShowMessage('Neocakavana chyba!');
end;
end;