Autor Téma: Array DML (FireDAC) ->Zostáva neuvoľnená pamäť  (Přečteno 595 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #15 kdy: 09-07-2019, 20:33:59 »
Tebe príkaz Query.Transaction.Rollback nedá DB do pôvodného stavu?
V Tvojom popise som nepochopil jednu vec. Ideš riadok po riadku a zakaždým urobíš Commit. Ak máš výnimku ukončíš to. Ak nie, tak to dokončíš a urobíš Exec. To mi hlava neberie. Z môjho pohľadu to je duplicitné uloženie údajov.
Pozri sem:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Array_DML_(FireDAC)
Example 1.
Mám ArraySize nastavený na 10 000. Takže pred EXEC prebehne 10 000 INSERT INTO príkazov.
V každom cykle len reagujem na stav, či treba iba zápis (insert into), alebo k nemu aj Exec a Commit.
Po exec robím Commit. ( Presne až po tých desiatich t. ) Po commit nastavím Begin Transaction..
Cyklus pokračuje.
Až po ukončení cyklu ešte kontrolujem, či niečo nezostalo na Commit-nutie.
Resp. či nie je otvorená transakcia.
Asi tak: Skáčem po 10t. Ale tabuľka nemá čistý násobok 10t (spravidla nikdy), tak zostanú nejaké drobné na záver.
« Poslední změna: 09-07-2019, 20:52:07 od miroB »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #16 kdy: 09-07-2019, 21:01:58 »
Citace
V každom cykle len reagujem na stav, či treba iba zápis (insert into), alebo k nemu aj Exec a Commit.
Predpokladám, že kontroluješ nejaké podmienky na základe ktorých sa rozhodneš. Tak mi to je jasnejšie. Len mi to trocha nesedí. Možno si sa iba zle vyjadril.
V mojom poňatí by to bolo takto. "V každom cykle len reagujem na stav, či treba iba zápis. Ak áno, tak urobím InsertInto a na konci cyklu Exec a Commit."
No nechajme to už tak. Ako Ťa poznám, tak to máš poriadne premyslené a vyskúšané ;)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1821
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #17 kdy: 09-07-2019, 21:07:57 »
Ako Ťa poznám, tak to máš poriadne premyslené a vyskúšané ;)

Ja verim vic FireDAC nez Mirovi ;D Myslim si, ze kdyby v prenosu byl memory leak, nekdo by na nej uz upozornil. Tak ci tak, mereni pameti pomoci OS neni spravne.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #18 kdy: 09-07-2019, 21:09:57 »
Ja som mal na mysli len to spracovanie záznamov, nie predmet diskusie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #19 kdy: 09-07-2019, 21:33:12 »
Ja verim vic FireDAC nez Mirovi ;D Myslim si, ze kdyby v prenosu byl memory leak, nekdo by na nej uz upozornil. ..
Aj ja mám rád FireDAC. Netvrdím, že je zlý. Naopak. Ale pamätáš sa snáď, že sme mu museli v nejakých prípadoch pomôcť. Niekde to tu bude zachytené.
Táto otázka začala, že či neexistuje po Array DML nejaký flush. Teraz síce nemám priamu odpoveď, len viem, že keď je query preč, pamäť je zjavne a s istotou voľná. Zatiaľ to stačí.
Myslím aj Radek písal, že si Query a spol vytvára v runtime. Nič zvláštne teda nespravím.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #20 kdy: 09-07-2019, 21:37:50 »
.. a na konci cyklu Exec a Commit..
Nie. Exec a Commit už v cykle. Vždy keď sa naplní 10t riadkov.
No a po cykle tiež, len už tam bude zrejme riadkov menej než 10t.
Pretože tabuľka má v danom prípade cca 500t riadkov, tak v cykle je to dosť veľa krát, čo musí prísť Exec.
A po cykle ešte jeden Exec na záver.
« Poslední změna: 09-07-2019, 21:40:17 od miroB »

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1821
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #21 kdy: 09-07-2019, 21:48:11 »
Ja som mal na mysli len to spracovanie záznamov, nie predmet diskusie.

TLDR ::) DML Array je velmi efektivni zpusob prenosu dat a FireDAC jej ma (nebo alespon mel) resen korektne, takze bych v tomto pripade hledal spis chybu na strane programatora nez FireDAC. Mozna se vsak pletu a FireDAC obsahuje memory leak. Pro analyzu vsak potrebuji MCVE.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #22 kdy: 10-07-2019, 07:54:18 »
Nerozumiem prečo píšeš o dvoch cykloch, keď na to určite stačí jeden.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #23 kdy: 10-07-2019, 10:22:11 »
Nerozumiem prečo píšeš o dvoch cykloch, keď na to určite stačí jeden.
Nepíšem o počte cyklov. Cyklus je jeden. Ale sú dve miesta, kde robím Exec a Commit. Ak je to vnútri v cykle, tak za tým ešte aj StartTransaction.

Sú dve základné kombinácie:
  • ArraySize > počet riadkov tabuľky, tak sa Exec/Commit vykoná iba raz a to až za cyklom
  • V opačnom prípade sa Exec/Commit vykoná aj vnútri cyklu.
    Presne toľkoto krát: (počet riadkov div ArraySize). No a potom raz pravdepodobne aj za cyklom.
    To ak platí ( počet riadkov > ( ArraySize * (počet riadkov div ArraySize) ).
    Inak nie, lebo čírou náhodou by to znamenalo, že počet riadkov je presným násobkom ArraySize
« Poslední změna: 10-07-2019, 10:26:24 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #24 kdy: 10-07-2019, 10:36:50 »
..TLDR ::) DML Array je velmi efektivni zpusob prenosu dat a FireDAC jej ma (nebo alespon mel) resen korektne, takze bych v tomto pripade hledal spis chybu na strane programatora nez FireDAC. Mozna se vsak pletu a FireDAC obsahuje memory leak. Pro analyzu vsak potrebuji MCVE..
Ani mne to nedá. Po ránu s občerstveným elánom, sa pokúšam program učesať.
Okrem iného som zamenil Query za Command. Zdá sa, že sa znížilo rezíduum cca o 40%.
Ale prekopávam aj svoju štruktúru. Aby som poctivo a v pravý čas likvidoval všetky Pointre, Tarray<> a TDictionary. Podľa toho, ako dopadnem, by som následne zvážil aj to MCVE

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1821
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #25 kdy: 10-07-2019, 12:43:48 »
Táto otázka začala, že či neexistuje po Array DML nejaký flush. Teraz síce nemám priamu odpoveď, len viem, že keď je query preč, pamäť je zjavne a s istotou voľná.

Muzes uvolnit hodnoty DML pole napr. nastavenim ArraySize. To je vec, kterou pro Tebe FireDAC neudela (resp. udela tusim s odpripravenim prikazu; pisu z hlavy). Primo po spusteni vsak zustavaji hodnoty parametru v kolekci.

Napada me ze by to nakonec mohlo byt i pointou dotazu... Nejde vsak o memory leak. Jde jen o krok jenz si musi programator zaridit sam.
« Poslední změna: 10-07-2019, 12:55:07 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1821
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #26 kdy: 10-07-2019, 14:57:55 »
Napada me ze by to nakonec mohlo byt i pointou dotazu... Nejde vsak o memory leak. Jde jen o krok jenz si musi programator zaridit sam.

Tady je podobne tema. Jde o C++ Builder, nicmene FireDAC je pro nej stejny. Psal jsem tam o perzistenci kolekce parametru i po uzavreni prikazu, tedy podle vseho bude treba pouzit jeden z nabizenych zpusobu (metodou Clear, cimz se uvolni objekty parametru vcetne hodnot, pripadne redukci velikosti ArraySize, cimz se uvolni pouze hodnoty pole parametru).

Velikost pameti je vsak z vyse popsanych duvodu treba sledovat memory managerem.
« Poslední změna: 10-07-2019, 15:08:59 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #27 kdy: 10-07-2019, 15:13:48 »
Táto otázka začala, že či neexistuje po Array DML nejaký flush. Teraz síce nemám priamu odpoveď, len viem, že keď je query preč, pamäť je zjavne a s istotou voľná.

Muzes uvolnit hodnoty DML pole napr. nastavenim ArraySize. To je vec, kterou pro Tebe FireDAC neudela (resp. udela tusim s odpripravenim prikazu; pisu z hlavy). Primo po spusteni vsak zustavaji hodnoty parametru v kolekci.

Napada me ze by to nakonec mohlo byt i pointou dotazu... Nejde vsak o memory leak. Jde jen o krok jenz si musi programator zaridit sam.
Už mám MVCE. Správa sa to presne.. Na .. (škaredý výraz nedopíšem, aj keď som s tým stratil hafo času)
Nepomôže
Kód: Delphi [Vybrat]
  1.   FD_cmd.Params.ArraySize := 1; // NEPOMOZE
  2.   FD_cmd.Params.Clear; // NEPOMOZE
Hmm nepomôže dokonca nič?

Projekt vytvorí *.db3, a naplní na veľkosť 123 MB. Tam kde je exe.
Tabuľka sa zobrazí po vygenerovaní dát. Je tam aj pokus o vyčistenie. Ale to nefunguje.
Myslím, že mi zostáva visieť na 25 MB, bez ohľadu na to, či sú výsledné data 123 MB, alebo cca 40 MB
Naďalej robím len s Task Managerom. Nemám čas na iné. Ale princíp je jasný.

Spravil som si medzitým verziu 2: Všetky data som strčil do dataModule.
Tu pomôže jediné na záver: DataModule1.Free A pamäť je okamžite k dispozícii.
« Poslední změna: 10-07-2019, 15:29:43 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 513
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #28 kdy: 10-07-2019, 15:44:01 »
..Ja verim vic FireDAC nez Mirovi ;D
No tak ja ti teraz nejak neviem.. Možno by si mi mohol začať veriť:)
..Tak ci tak, mereni pameti pomoci OS neni spravne..
Hmm, no vysvetli užívateľovi, ktorý nič iné nevie, než TM.
Keď som použil TFDQuery, zostávalo visieť cez 50 mega. Veru nijak málo.
Začal by som autora programu podozrievať, že asi nemá vo svojom diele poriadok. (myslím svoj program, nie FireDAC)
Tomu som sa chcel určite vyhnúť.

Zdá sa, že pre FDCommand, je kus menšia spotreba pamäti. (aspoň tej, čo sa opticky neuvoľní)

Inak súkromne povedané, memory Leak to nebude. Pretože som schopný napriek tomu otvárať a čítať ďalšie a ďalšie Excel súbory, bez zavretia programu.
Ak by šlo o memory leak, určite by som časom zamrzol.
« Poslední změna: 10-07-2019, 15:46:32 od miroB »

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1821
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Array DML (FireDAC) ->Zostáva neuvoľnená pamäť
« Odpověď #29 kdy: 10-07-2019, 15:49:49 »
Už mám MVCE.

Podivam se jak budu u Delphi.

..Ja verim vic FireDAC nez Mirovi ;D
No tak ja ti teraz nejak neviem.. Možno by si mi mohol začať veriť:)

Nee ;D ;D ;D

Hmm, no vysvetli užívateľovi, ktorý nič iné nevie, než TM.

Jak uz jsem psal, memory manager si muze oznacit bloky pameti za volne, ale nevrati je systemu. Memory manager ma byt pro tuto ulohu optimalizovany.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!