Optymalizacja Zużywanej pamięci

0

Witam.
Mam pewien problem otóż chciałbym zoptymalizować zużycie pamięci przez program ale w danym momencie.
Załóżmy, że pobieram z bazy PostgreSQL dane jest ich raptem 800 pozycji. dalej wczytuję to do stringgrida i na komputerze który ma zainstalowane 256Mb pamięci zaczyna zapisywać dane do PAGEFILE (wczytanie 800 pozycji zajmuję mu jakieś 40s) Czy da się ten czas skróci?

Komputer to staruszek 400Mhz i 256MB RAM ale program ten musi na nim działać raczej nie wchodzi w rachubę wymiana sprzętu. a Może StringGrida wymienić na coś mniej pamięciożernego.

procedure WczytajKontrahentow(SGrid : TStringGrid);
var
  aRow : LongWord;
  zapytanie : String;
begin
  UstawSG(SGrid);
  NadajNazwyKolumn_DlaKontrahentow(SGrid, 6);
  if get_UstawBaze then set_baza := iKomisMag1.UstawBaze(InfoDB.db_rksystem +InfoDB.rok) else set_baza := True;
  if set_baza then
  begin
    try
      zapytanie := 'SELECT * FROM '+schema_kartoteki+'.'+table_kontrahenci+' '+
                   'ORDER BY nr_klienta ASC;';
      DB_AdoDataSetZapytanie(zapytanie);
      DB_AdoDataSet.Active := True;
      DB_AdoDataSet.First;
      if DB_AdoDataSet.RecordCount > 0 then
      begin
        SGrid.RowCount := DB_AdoDataSet.RecordCount +1;
        for aRow := 1 to DB_AdoDataSet.RecordCount do
        begin
          SGrid.Cells[0, aRow] := IntToStr(aRow);
          SGrid.Cells[1, aRow] := DB_AdoDataSet.FieldByName('id').AsString;
          SGrid.Cells[2, aRow] := DB_AdoDataSet.FieldByName('nr_klienta').AsString;
          SGrid.Cells[3, aRow] := DB_AdoDataSet.FieldByName('imie').AsString +' ' +DB_AdoDataSet.FieldByName('nazwisko').AsString;
          if DB_AdoDataSet.FieldByName('nr_lokalu').AsString <> '' then
          begin
            SGrid.Cells[4, aRow] := DB_AdoDataSet.FieldByName('ulica').AsString +' ' +DB_AdoDataSet.FieldByName('nr_domu').AsString +' m ' +DB_AdoDataSet.FieldByName('nr_lokalu').AsString;
          end else SGrid.Cells[4, aRow] := DB_AdoDataSet.FieldByName('ulica').AsString +' ' +DB_AdoDataSet.FieldByName('nr_domu').AsString;
          SGrid.Cells[5, aRow] := Trim(DB_AdoDataSet.FieldByName('kod_pocztowy').AsString +' ' +DB_AdoDataSet.FieldByName('miejscowosc').AsString);
          SGrid.Cells[6, aRow] := DB_AdoDataSet.FieldByName('dowod_os').AsString;
          DB_AdoDataSet.Next;
        end;
      end;
    finally
      DB_AdoDataSet.Active := False;
      AutoSizeGrid(SGrid);
      SGrid.ColWidths[1] := -1;
      SGrid.Repaint;
    end;
  end;
end;
0
  1. TStringGrid to nie najlepszy wybór, nie możesz skorzystać z TDBGrid?

SGrid.Cells[4, aRow] := DB_AdoDataSet.FieldByName('ulica').AsString +' ' +DB_AdoDataSet.FieldByName('nr_domu').AsString +' m ' +DB_AdoDataSet.FieldByName('nr_lokalu').AsString;

Takie złączenie rób już na poziomie zapytania do bazy, a nie dopiero w Delphi.
3. Wczytuj tylko pierwsze 100 rekordów, resztę wczytuj na żądanie użytkownika.
4. Przeprojektuj program tak aby można było wstawiać rekordy nie tylko z poziomu grida ale też z formatki, dzięki temu przy bieżącej pracy nie będzie konieczne wczytywanie wszystkich rekordów.

0

Faktycznie myślałem aby program wczytywał 100 rekordów i dalej na życzenie użytkownika.
Wiem już w czym jest główny problem to nie stringgrid jest tu największym problemem lecz ADODATASET.
Przy pobraniu z bazy mniejszej ilości danych zużywa mniej pamięci.
na początku dla 800 pozycji allokował sobie 200MB po wybraniu kolumn mnie interesujących w zapytaniu alokacja pamięci zmniejszyła się na 120MB a jak w zapytaniu wpiszę aby pobrał samo ID to alokuje 70MB dla 800 pozycji czy to nie jest zbyt wiele?

W dodatku program został tak napisany, aby wykonac zapytanie łącze się z biblioteką statycznie wykonuję procedurę i przekazuję dane z biblioteki do programu. może tutaj coś nie tak jest zrobione.

Dzieki za wszelkie uwagi (oczywiście były one dla mnie pomocne).

0

Ok problem z pamięcią został rozwiązany wystarczyło ustawić:
AdoCommand.CommandType := cmdUnknown;
zamiast
AdoCommand.CommandType := cmdText;

a i trzeba pamiętać aby w selekcie dać np?
SELECT id::varchar FROM ...
zamiast
SELECT id FROM ...

Generalnie przy takich zapytaniach pamięć nie jest nigdzie allokowana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1