ďťż
 
ADO, postgresql - problemy z pamiecia ďťż
 
ADO, postgresql - problemy z pamiecia
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

ADO, postgresql - problemy z pamiecia



hazet - 03-08-2007 09:28
ADO, postgresql - problemy z pamiecia
  Witam,

Mam dziwny problem. Napisalem aplikacje w Turbo C++ laczaca sie z
postresql za pomoca komponentow ADO. Po uruchomieniu aplikacja zajmuje
w pamieci ponad 120MB! Nie wiem co jest przyczyna. Na formularzu
DataModule mam: Obiekt TADOConnection, 5 obiektow TADODataset i 9
komponentow TADOCommand(dla kazdej tabeli mam 3 komponenty -ADODataSet
do pobierania danych ADOCommand z parametrami do wstawiania wiersza i
jeszcze jeden ADOCommand do updatowania rekordu). Problem polega na
tym iz nawet gdy nie ma w tabeli duzo rekordow to program zajmuje w
pamieci od 120-160MB, co jest raczej nienormalne dla takiego
programu?
Mam na glownym formularzu DBGrida, i w zaleznoci jaka zakladke
klinkniel uzytkownik to komponentowi DataSource przypisuje dany
DataSet danej tabeli, DBGrid jest ustawiony na datasource. W przypadku
gdy nie pobieram zadnych danych do datasetow to program zajmuje ok
9MB. Sadze ze problem moze byc w tym iz po prostu dane z tabeli tyle
zajmuja, mam tabele:
CREATE TABLE tab1
(
id serial NOT NULL PRIMARY_KEY,
pole1 character varying(255) NOT NULL,
pole2 character varying(255) NOT NULL,
pole3 real NOT NULL,
pole4character varying(255) NOT NULL,
pole5 character varying(100) NOT NULL,
pole6 character varying(255),
pole7 character varying(255) NOT NULL,
pole8 character varying(255),
pole9 character varying(255),
pole10 character varying(255),
pole11 integer NOT NULL,
pole12 integer NOT NULL,
pole13 real NOT NULL,
pole14 real NOT NULL,
pole15 character varying(100)
);

CREATE TABLE tab2
(
id serial NOT NULL PRIMARY KEY,
tab1_id integer NOT NULL REFERENCES tab1(id), -- klucz obcy z tabeli
1
pole1 real NOT NULL,
pole2 real NOT NULL,
pole3 integer NOT NULL,
pole4 integer NOT NULL,
)

w tabeli 1 mam nie duzo rekordow(np 2, 3), natomiast w tab2 jest ich
ok 190 i stanowia relacje z tab1.
lacze te tabele left joinem
SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id = tab2.tab1_id ORDER BY
tab1.id

Mam oprocz tego jeszcze 3 mniejsze tabele.

Mozliwe jest zeby przy takiej ilosci danych po zapytaniu dane w
datasecie tyle zajmowaly?
Nie moge zamiast varchar zastosowac typu text poniewaz przy uzyciu
komonentow ADO DBGrid nie wyswietla takich napisow prawidolowo(zamiast
tekstu wyswietla sie WIDEMEMO). Co moze byc przyczyna takiej
pamieciochlonnosci i jak ewentualnie moge sobie z tym poradzic? Nie
jest to przeciez duza ilosc danych

PS. Mam jeszcze pytanie czy da sie jakos przyspieszyc dzialanie
komponentow ADO poniewaz pobieranie danych z bazy dosyc dlugo trwa.

pozdrawiam





Morff - 03-08-2007 09:28

  Pytanie podstawowe brzmi :
PO CO
sciagasz wszystkie dane z serwera na klienta ?

Połączenie sie czesto zrywa ? musisz sortowac duża ilosc danych na
wszystkie sposoby ? naprawde nie przychodzi mi do głowy zaden powód dla
którego trzeba dane z kilku tabel przepychac pomiedzy serwerem a klientem.

jak odpowiesz na to pytanie , to sie zastanowimy nd resztą.

--
Pozdrawiam
Morff
--------------------
AQQ 141151




hazet - 03-08-2007 09:28

  On 2 Sie, 18:53, Morff <mor...@wp.pl> wrote:
> Pytanie podstawowe brzmi :
> PO CO
> sciagasz wszystkie dane z serwera na klienta ?
>
> Po czenie sie czesto zrywa ? musisz sortowac du a ilosc danych na
> wszystkie sposoby ? naprawde nie przychodzi mi do g owy zaden powód dla
> którego trzeba dane z kilku tabel przepychac pomiedzy serwerem a klientem.
>
> jak odpowiesz na to pytanie , to sie zastanowimy nd reszt .
>
> --
> Pozdrawiam
> Morff
> --------------------
> AQQ 141151

To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A
dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym
w zaleznosci ktora tabele chce przegladac uzytkownik.

pozdrawiam




Morff - 03-08-2007 09:28

 
> To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A
> dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym
> w zaleznosci ktora tabele chce przegladac uzytkownik.
>
> pozdrawiam

nadal nie widze powodu dla którego uzywasz adodataset zamiast adoquery z
kursorem po stronie serwera.
To ze uzytkownik chce ogladać jakąś tabele to nie powód zeby mu zciagac
wszystkie dane do aplikacji.
wystarczy JEDNO ado query , podpiąc datasource + dbgrid , a query
modyfikowac w zależnosci od tego którą tebele chce user ogladać.
Po drugie user nie widzi tysiąca rekordów w gridzie tylko jakąś
ograniczoną ilosc ... po co wiec zciagac tysiące rekordów, nie lepiej
zmusić usera zeby zapytał o to co chce zobaczyc ?

--
Pozdrawiam
Morff
--------------------
AQQ 141151





hazet - 03-08-2007 09:28

  On 2 Sie, 19:17, Morff <mor...@wp.pl> wrote:
> > To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A
> > dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym
> > w zaleznosci ktora tabele chce przegladac uzytkownik.
>
> > pozdrawiam
>
> nadal nie widze powodu dla którego uzywasz adodataset zamiast adoquery z
> kursorem po stronie serwera.
> To ze uzytkownik chce oglada jak tabele to nie powód zeby mu zciagac
> wszystkie dane do aplikacji.
> wystarczy JEDNO ado query , podpi c datasource + dbgrid , a query
> modyfikowac w zale nosci od tego któr tebele chce user oglada .
> Po drugie user nie widzi tysi ca rekordów w gridzie tylko jak
> ograniczon ilosc ... po co wiec zciagac tysi ce rekordów, nie lepiej
> zmusi usera zeby zapyta o to co chce zobaczyc ?
>
> --
> Pozdrawiam
> Morff
> --------------------
> AQQ 141151

ADOQuery tak jak i ADODataset maja pole - CursorLocation, mozna
ustawic tez dla ADODatasetu na clUseServer. Chyba ze ADOQuery jest sam
w sobie znacznie szybszy od ADODataseta???/ Zamienilem dataseta na
adoquery ustawilem kursor na clUseServer, chyba nie zajmuje tyle
pamieci ale nie mozna z tak ustaionym kursorem robic tego co z
kursorem po stronie klienta, ponadto podczas proby podpiecia
datasource do adoquery dostalem wyjatek:
Exception class EDatabaseError with message 'Dataset does not support
bookmarks, which are required for multi-record data controls'.
Moze trzeba zmienic jeszcze pole CursorType? Przy ustawionym
CursorLocation na clUseClient nie bylo wyjatku.

> wystarczy JEDNO ado query , podpi c datasource + dbgrid , a query
> modyfikowac w zale nosci od tego któr tebele chce user oglada .
Co do tego czy zastosowac jeden czy wiele komponentow, to w programie
jest jeszcze opcja dostepu do tabel z poziomu innych formularzy tzn.
jezeli na DBGridzie jest akurat aktywna tabelaA to user i tak moze
otworzyc formularz korzystajacy z innej tabeli, jak bym zastosowal
jeden dataset to musialbym usunac to co aktualnie jest w dbgridzie. W
pozostalych komponentach ADOCommand mam wpisane parametry do zapytan
insert oraz update.

> Po drugie user nie widzi tysi ca rekordów w gridzie tylko jak
> ograniczon ilosc ... po co wiec zciagac tysi ce rekordów, nie lepiej
> zmusi usera zeby zapyta o to co chce zobaczyc ?
Jasne tutaj sie zgadzam, chce zrobic oczywiscie filtry do
wyszukiwania, ktore beda zawezaly wyniki, opcja z ograniczeniem ilosci
wierszy jest dobrym pomyslem

dzieki, pozdrawiam




Morff - 03-08-2007 09:28

  Dnia 02-08-2007 o 20:13:38 hazet <hazet@os.pl> napisał:

> Jasne tutaj sie zgadzam, chce zrobic oczywiscie filtry do
> wyszukiwania, ktore beda zawezaly wyniki, opcja z ograniczeniem ilosci
> wierszy jest dobrym pomyslem

nie filtry ...
zapytanie z parametrami ... Zanim wyświetlisz rekordy poproś usera o
podanie warunków zapytania ..
Jezeli nie poda warunków lub poda warunek który spełniają wszystkie
rekordy .. to niech czeka.

Generalnie ... przemyśl jeszcze raz projekt aplikacji - pomyśl czy nie
powinieneś otwierac formy z pustym gridem i nie wymusic na userze w ten
sposób podania warunków dla zapytania , nie otwierac wszystkich datasetów
przy otwieraniu aplikacji , tylko otwierac te które sa potrzebne .
Powiązac odpowiednie datasety z formularzami (dataset połozony na formie i
nie zciągajacy zawartosci całej tabeli) ...

--
Pozdrawiam
Morff
--------------------
AQQ : 141151 (morff@aqq.eu)




Bronek Kozicki - 06-08-2007 00:01

  Morff <morff1@wp.pl> wrote:
> zapytanie z parametrami ... Zanim wyświetlisz rekordy poproś usera o
> podanie warunków zapytania ..
> Jezeli nie poda warunków lub poda warunek który spełniają wszystkie
> rekordy .. to niech czeka.

nie wiem jak to jest w tej konkretnej bibliotece, ale przecież
użytkownik na raz nie *widzi* tysiąca rekordów. Sprytna biblioka
ściągałaby tylko dane dla wierszy widocznych w danym momencie, plus ew.
bufor na następną/poprzednią stronę.

B.




hazet - 07-08-2007 00:01

  On 6 Sie, 00:11, "Bronek Kozicki" <b...@spam-trap-cop.net> wrote:
> Morff <mor...@wp.pl> wrote:
> > zapytanie z parametrami ... Zanim wy wietlisz rekordy popro usera o
> > podanie warunków zapytania ..
> > Jezeli nie poda warunków lub poda warunek który spe niaj wszystkie
> > rekordy .. to niech czeka.
>
> nie wiem jak to jest w tej konkretnej bibliotece, ale przecie
> u ytkownik na raz nie *widzi* tysi ca rekordów. Sprytna biblioka
> ci ga aby tylko dane dla wierszy widocznych w danym momencie, plus ew.
> bufor na nast pn /poprzedni stron .
>
> B.
No wlasnie ADO nie jest takie sprytne, tak dziala chyba BDE
przynajmiej mi sie tak wydaje.

pozdrawiam




Bronek Kozicki - 12-08-2007 00:07

  hazet wrote:
> No wlasnie ADO nie jest takie sprytne, tak dziala chyba BDE
> przynajmiej mi sie tak wydaje.

ADO nie ma grida; to jest sprawa GUI

B.

--
Remove -trap- when replying. Usun -trap- gdy odpisujesz.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?= mysql i mysql-front, problem String line; if (line=="cos"){...}....problem [oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?= [PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?= postgresql - int/int Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ] [PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ? [MySQL] Problem z zapisem danych w bazie danych Problem z mysql - can't connect to MySQL/nietypowo...
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nawschodzie.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com