out of memory 問題 原來是 SQLite 的搞的鬼,用 SQLite 一定要用 using 包起來
今天碰到一個奇怪問題 還是記一下:
我需要開2500個 DB檔案 讀取資料
用 windows 程式
一般都是直接用 foreach
所以是
new myOpenDB
foreach (string item in fileList )
{ 開檔 讀取 處理 }
但是到 1000多時 就報偵錯錯誤...
後來為了知道是卡在哪個檔
改用 Thread 來跑 為了將 name show出來
//建立Thread
new Thread(() =>
{
foreach (string item in fileList )
{ 開檔 讀取 處理
label1.Text = item;
}
神奇的事 ....沒有報錯了 順利跑完...
記一下 下次有大量資料處理 開個 thread 去跑比較安全
****************************************************
最後寫MVC時發現
SQLite 會不停累積 就會 發生 out of memory
close不掉 還是掛
vs2017 可以看執行佔用 RAM
一跑起來就從 170M 直線上升 800M..900M....掛
每次 new 再重開 Close 再重開 都沒用....
查google 原來要加 useing
本來是
var command = new SQLiteCommand(Lcon)
command.CommandText = @"select * from Tel_all where Rec_NO=" + RecNo;
SQLiteDataReader Dread = command.ExecuteReader();
if (Dread.Read()) Tel = Dread["tel"].ToString().Trim();
Dread.Close();
記憶體飆升
改
using (var command = new SQLiteCommand(Lcon))
{
command.CommandText = @"select * from Tel_all where Rec_NO=" + RecNo;
SQLiteDataReader Dread = command.ExecuteReader();
if (Dread.Read()) Tel = Dread["tel"].ToString().Trim();
Dread.Close();
}
記憶體就頂多就到 190M
沒做大量測試 真不知道 怎麼死的
我需要開2500個 DB檔案 讀取資料
用 windows 程式
一般都是直接用 foreach
所以是
new myOpenDB
foreach (string item in fileList )
{ 開檔 讀取 處理 }
但是到 1000多時 就報偵錯錯誤...
後來為了知道是卡在哪個檔
改用 Thread 來跑 為了將 name show出來
//建立Thread
new Thread(() =>
{
foreach (string item in fileList )
{ 開檔 讀取 處理
label1.Text = item;
}
}).Start();
神奇的事 ....沒有報錯了 順利跑完...
記一下 下次有大量資料處理 開個 thread 去跑比較安全
****************************************************
最後寫MVC時發現
SQLite 會不停累積 就會 發生 out of memory
close不掉 還是掛
vs2017 可以看執行佔用 RAM
一跑起來就從 170M 直線上升 800M..900M....掛
每次 new 再重開 Close 再重開 都沒用....
查google 原來要加 useing
using 陳述式 (C# 參考)
本來是
var command = new SQLiteCommand(Lcon)
command.CommandText = @"select * from Tel_all where Rec_NO=" + RecNo;
SQLiteDataReader Dread = command.ExecuteReader();
if (Dread.Read()) Tel = Dread["tel"].ToString().Trim();
Dread.Close();
記憶體飆升
改
using (var command = new SQLiteCommand(Lcon))
{
command.CommandText = @"select * from Tel_all where Rec_NO=" + RecNo;
SQLiteDataReader Dread = command.ExecuteReader();
if (Dread.Read()) Tel = Dread["tel"].ToString().Trim();
Dread.Close();
}
記憶體就頂多就到 190M
沒做大量測試 真不知道 怎麼死的
留言
張貼留言