Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Využij akce až 80 % zdarma při nákupu e-learningu - více informací. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Swift
Avatar
David Řičař:16.3.2020 12:15

Ahoj,
mam problém s EF6 a uvolňováním paměti. Mám program, který běží ve smyčce a řeší data a synchronizaci v DB. Např. následujícím kódem se ukládá poslední datum a čas synchronizace.

Using dbImport As New BackendEntities()

        Dim zarizeniDb As Zarizeni = (From z In dbImport.Zarizeni Where z.Id_zarizeni = zarizeni.Id_zarizeni Select z).FirstOrDefault

        zarizeniDb.Datum_synch = Now
        dbImport.SaveChanges()

        dbImport.Dispose()

End Using

Pokud pustím i jen tento kód ve smyčce, tak paměť postupně roste o necelých 200kb / cyklus. Zkusil jsem přidat Dispose() ale nepomohlo

Zkusil jsem: Zkusil jsem i vynutit uvolnění paměti

GC.Collect()

ta se uvolní např z 8000kb na 6000kb, v dalším kroku je to už z 8200 na 6200 atd. V celém programu je tento skok cca 40mega na cyklus :(

Chci docílit: Synchronizace položek

 
Odpovědět
16.3.2020 12:15
Avatar
Odpovídá na David Řičař
Michal Štěpánek:17.3.2020 20:30

GC čistí automaticky, ale uvolňuje z paměti pouze ty objekty, se kterými se nějakou dobu nepracuje a nejsou na ně aktivní žádné vazby, takže v tomto případě ti je GC na prd.
K čemu to vlastně má sloužit? Tato smyčka je podle mě naprosto zbytečná, když informaci o synchronizaci můžeš někam ukládat rovnou při nějaké jiné akci, např. když uložíš záznam do té tabulky dbImport...

Nahoru Odpovědět
17.3.2020 20:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na David Řičař
vajkuba1234:22.3.2020 2:32

Chapu spravne, ze v ramci nejakeho cyklu volas metodu s tim usingem, ktera udela to, ze vytvori spojeni s db, vytahne cely zaznam, upravi datum a zase ulozi?

Jak casto to volas?

Nahoru Odpovědět
22.3.2020 2:32
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na David Řičař
vajkuba1234:22.3.2020 2:38

Co dela BackendEntities? Neni to nahodou dbContext?
Jak casto musis zaznamy synchronizovat?

Nahoru Odpovědět
22.3.2020 2:38
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
David Řičař:23.3.2020 11:25

Celý program pracuje tak, že načte data z jedné DB, pak je pročistí, upraví a vloží do druhé DB. Jedná se např. o skladové karty, prodeje... Takže ve smyčce načítám data z první databáze, tam je to v pohodě to mám přes dotazy. Data pak pročistím a upravím. Následně vytvořím, pro každou "tabulku" vlastní dbContext a přes EntityFramework vytvářím/upravuji jednotlivé entity, které se uloží do DB. Celá práce s dbContextem je v using bloku. Takže by se mělo následně vše zahodit a uvolnit paměť. Cyklus běží každých 10 minut a problém je, že se můžou už zapsaná data změnit, takže musím entity porovnávat. (Mám skladovou kartu, tu si musím najít a pokud již existuje tak přepsat hodnoty). Co jsem zkoumal, tak problém je právě v hledání entit v dbContextu.

Dim zarizeniDb As Zarizeni = (From z In dbImport.Zarizeni Where z.Id_zarizeni = zarizeni.Id_zarizeni Select z).FirstOrDefault

To nějak zůstává v paměti.Ale asi ani ne ta entita jako taková, ale nějaká data ohledně vyhledávání. Nyní to v každém cyklu a 15tis. kartách skáče o 40mb nahoru.

A ještě jedna záhada, pokud se jedná o první spuštění programu, kde se navíc na začátku jen vytváří DB jinak je proces stejný se stejnou metodou tak vše funguje jak má. A uvolňuje se vše. :(

 
Nahoru Odpovědět
23.3.2020 11:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.