EF - הזיכרון לא משתחרר
-
בפונקציה הבאה אני מוסיף קרוב ל 700 אלף רשומות לטבלה, ומתקבלת שגיאה OutOfMemoryException
השאלה מדוע הזיכרון לא משתחרר? לכאורא אחרי כל 100 אלף יש שיחרור מוחלט של כל המשאבים.Private Sub AddListToTree(ByVal list As List(Of Node)) Dim db As New TreeDbContext db.Tree.Load Dim nodeId As Integer = 1 Dim transaction = db.Database.BeginTransaction() Dim Counter As Integer = 0 For Each node In list Counter += 1 If Counter Mod 100000 = 0 Then transaction.Commit() transaction.Dispose() db.Dispose() db = New TreeDbContext transaction = db.Database.BeginTransaction() GC.Collect() End If node.Id = nodeId nodeId += 1 db.Database.ExecuteSqlCommand( "INSERT INTO [Tree]([Name], [Order], [Type], [Parent_Id]) VALUES (@p0, @p1, @p2, @p3);", node.Name, node.Order, CByte(node.Type), If(node.Parent Is Nothing, DBNull.Value, node.Parent.Id)) Next transaction.Commit() transaction.Dispose() db.Dispose() End Sub
פורסם במקור בפורום CODE613 ב18/05/2017 22:24 (+03:00)
-
@דוד ל.ט.
א. באיזה רשומה הוא אוחז בשגיאה?
ב. למה הטרנזקציה? בשביל מה?
ג. אני ממש לא מבין מה בכלל לוקח זיכרון בקוד הזה. הdb בכלל לא אמור להתמלא מעבר לload שיש בהתחלה. אולי הקוד פה לא מלא?א. בין 500 ל 600 אלף הוא קורס
ב. עשיתי בלי וכל הוספת רשומה לקח 200 מילישניות, ועם טרנזקציה כל הוספה פחות מ1 מילישניות.
ג. כל הקוד במלאו, מדובר במסד SQLITE אם זה משנה.פורסם במקור בפורום CODE613 ב18/05/2017 23:59 (+03:00)
-
@דוד ל.ט.
ג. אני ממש לא מבין מה בכלל לוקח זיכרון בקוד הזה. הdb בכלל לא אמור להתמלא מעבר לload שיש בהתחלה. אולי הקוד פה לא מלא?
ג. כל הקוד במלאו, מדובר במסד SQLITE אם זה משנה.
אולי זה יעזור לך
ב SQLITE בכל פעם שנפתח מסד נתונים, הסריקה כולה מסומנת ומנותחת ועץ ניתוח לסכימה מוחזק בזיכרון. כלומר, זמן ההתחברות של מסד הנתונים ושימוש בזיכרון הראשוני הוא יחסי לגודל הסכימה - מכאן https://www.sqlite.org/limits.html - שורה אחרונה.פורסם במקור בפורום CODE613 ב19/05/2017 09:12 (+03:00)
-
ב SQLITE בכל פעם שנפתח מסד נתונים, הסריקה כולה מסומנת ומנותחת ועץ ניתוח לסכימה מוחזק בזיכרון. כלומר, זמן ההתחברות של מסד הנתונים ושימוש בזיכרון הראשוני הוא יחסי לגודל הסכימה - מכאן https://www.sqlite.org/limits.html - שורה אחרונה.
כן, אבל למה הזכרון לא משתחרר הרי אני 'סוגר' את הדטה ביס? אני רוצה להגיע למצב כאילו סגרתי את התוכנה לגמרי ופתחתי שוב, מה חסר בקוד שלי? מה הייתי צריך לשחרר ולא שיחררתי? או אולי זה באג פנימי בתוך ה EF או ה SQLITE, אבל קשה לי להאמין.
פורסם במקור בפורום CODE613 ב19/05/2017 09:29 (+03:00)
-
ממש השבוע שמעתי שיש הבדל אם הsqLite הגישה אליו כקובץ, לבין אם הוא מותקן, בקובץ הוא הרבה יותר איטי ובעייתי.
לענ"ד אין למשפט זה הבנה, וזה לקוח בטעות מSqlServer שם יש AttachDbFilename שמיועד לצרכי פיתוח בלבד.
בsqlite אין מושג של מותקן - תמיד הקובץ הוא מת והמערכת המפעילה אותו זה האפליקציה שמשתמשת בו.פורסם במקור בפורום CODE613 ב19/05/2017 11:28 (+03:00)
-
"פתרתי את הבעיה" !!!
אותו הקוד בדיוק ללא שום שינוי רק להוסיף בשורה ראשונה MsgBox כך:Private Sub AddListToTree(ByVal list As List(Of Node)) MsgBox("") ' כל ההמשך אותו דבר
מה קורה פה??
גם שמתי לב ש"הפתרון" הזה לא עובד אם מיד שמופיעה ההודעה לוחצים אישור, צריך להמתין איזה 2 שניות ואז ללחוץ אישור ואז הכל עובד חלק.פורסם במקור בפורום CODE613 ב20/05/2017 21:13 (+03:00)
-
הנה קישור להורדת פרוייקט קטן שמדגים את הבעיה
https://magicode.me/send-file/file/83e4669febf62cdf15bfe5858f3135a58b51fa24/view
תודה רבהפורסם במקור בפורום CODE613 ב23/05/2017 00:34 (+03:00)