Witam,
Celem mojej funkcji jest odczytanie zawartości 108 plików składających się z pól miliona linijek i dodanie ich do tabeli w bazie danych Paradox poprzez BDE. W chwili uruchomienia programu tabela ma jedną kolumnę i pól miliona wierszy, dla każdego pliku program tworzy kolejną kolumnę i uzupełnia jej zawartość. Wszystko działa bez zarzutu jednak program jest potwornie wolny dodaje zaledwie ok 1000 wierszy na sekundę dla pojedyńczego pliku.
Wydaje mi sie ze powodem jest wyświetlanie zawartości bazy danych w oknie programu w komponencie DBGrid, jednak gdy usune polaczenie DataSource albo gdy ustawie właściwość DBGrid.Visible na False funkcja Table.Edit powoduje błąd:
"At beginning of table"
od wczoraj szukam w google rozwiązania niestety bezskutecznie...
Kod funkcji:
procedure TForm1.Button6Click(Sender: TObject);
var
PlikCel: TextFile;
oldopen, linia, wyraz, NazwaPliku: String;
i,z,k,wyr,pos: Integer;
sttab: Boolean;
f,g : TField;
begin
oldopen:=OpenDialogCel.FileName;
OpenDialogCel.Execute; pos:=0;
if OpenDialogCel.FileName<>oldopen then
for k:=0 to OpenDialogCel.Files.Count-1 do
begin
AssignFile(PlikCel, Form1.OpenDialogCel.Files[k]);
NazwaPliku:=ExtractFileName(OpenDialogCel.Files[k]);
SQLQuery.SQL.Clear;
DBCel.Active:=False;
SQLQuery.SQL.Add('ALTER TABLE Cel ADD MEAN'+IntToStr(DBCel.FieldDefs.Count)+' CHAR(10);');
SQLQuery.ExecSQL ;
DBCel.Active:=True;
DBCel.RecNo:=0;
sttab:=False; z:=0;
try
Reset(PlikCel);
DBCel.Edit;
while not EoF(PlikCel) do
begin
Readln(PlikCel,linia);
wyraz:='';
if Trim(linia)='' then sttab:=False; //konczy odczyt wartosci
if sttab=True then
begin
inc(z);
wyr:=0;
for i:=1 to Length(linia) do
begin
wyraz:=wyraz+Linia[i];
if (Linia[i]=#9) or (i=Length(linia)) then
begin
inc(wyr);
case wyr of
3: begin
DBCel.Edit;
DBCel['MEAN'+IntToStr(DBCel.FieldDefs.Count-1)]:=StringReplace(Trim(wyraz), '.', ',',[]);
DBCel.Post;
DBCel.MoveBy(1);
end;
{4: Form1.DBUstawien[NazwaPliku+'STDV']:=StringReplace(Trim(wyraz), '.', ',',[]);
5: Form1.DBUstawien[NazwaPliku+'PIX']:=StringReplace(Trim(wyraz), '.', ',',[]);}
end;
wyraz:='';
end;
end;
end;
//od nastepnej linii wartosci beda odczytywane
if Trim(linia)='CellHeader=X Y MEAN STDV NPIXELS' then sttab:=True;
end;
finally
CloseFile(PlikCel);
end;
ListaPlikowCel.Items.Add(NazwaPliku);
ListaPlikowCel.Checked[ListaPlikowCel.Items.Count - 1]:=True;
Memo1.Lines.Add(IntToStr(z));
end;
OpenDialogCel.FileName:=ExtractFileDir(OpenDialogCel.FileName)+'.cel';
end;
Wywołanie funkcji dla pojedynczego pliku bez zapisu do bazy danych (łącznie z tym potworkiem: StringReplace(Trim(wyraz), '.', ',',[]);) jest stosunkowo szybkie - ok 3 sek.
Usuwanie pojedynczej kolumny z kolei także trwa troche zbyt długo (okolo 10sec), nawet gdy jest pusta.
SQLQuery.SQL.Add('ALTER TABLE Cel DROP COLUMN '+DBCel.FieldDefs[1].Name+';');
SQLQuery.ExecSQL;
Jak ominąc błąd "At beginning of table"?
W jaki sposob mozna przyspieszyc dzialanie programu?
Bede bardzo wdzieczny za wszelka pomoc.