我使用以下代碼從SQLite數據庫填充ImageList
,並將圖像存儲爲blob。System.IO.MemoryStream的有效使用(或替代方案)
Public Sub populateImagesStyles()
ShoeImages1.Images.Clear()
StyleImagesLView.Items.Clear()
Dim s As SQLiteDataReader
Dim rcount As Integer = 0
dbLocalQuery = New SQLiteCommand("SELECT id, image FROM tblImages", dbLocal)
s = dbLocalQuery.ExecuteReader()
While s.Read()
rcount += 1
ShoeImages1.Images.Add(CStr(s("id")), byte2img(s("image")))
StyleImagesLView.Items.Add(CStr(s("id")), CStr(s("id")))
End While
s.Close()
這裏是byte2img功能...
Public Function byte2img(ByVal imgByte As Byte()) As Image
Dim imgMemoryStream As System.IO.MemoryStream = New System.IO.MemoryStream(imgByte)
byte2img = Drawing.Image.FromStream(imgMemoryStream)
End Function
該數據庫包含了超過250張,這個過程完成兩次load把兩個不同的ImageList
,因爲我需要在兩個顯示的圖像不同的尺寸。
當進程在加載表單時運行時,它會導致進程消耗800MB到1GB的系統內存,除非我再次從表單控件再次手動運行進程,這似乎觸發了垃圾回收。
單步加載過程很明顯,它是導致內存使用率升級的byte2img進程 - 緩解此問題的最佳方法是什麼?
此外,如果任何人都可以想到一個更有效的過程來執行此操作,我全部都是耳朵。圖像必須存儲在數據庫文件中,因爲我需要能夠將.db文件打包並在臨時通知時將其發送到遠程位置,所以我不能用圖像混淆文件夾。
所有幫助表示讚賞。
您是否需要一次加載所有圖像?你可以在你的表單上使用分頁,以便獲得前10張圖像,然後繼續下一個10等...? – LightningShield
如果您的圖像存儲在數據庫中,爲什麼將它們全部加載到應用程序中?你不能根據需要從數據庫中獲取它們,也許一旦它們被檢索到就可以保存它們,所以不需要重複。 – Plutonix
圖像被讀出到兩個ImageList中,詳見文章。這是數據庫CRUD功能的一部分 - 用戶可以修改記錄並通過點擊圖像選擇要與其他數據關聯的圖像。 如果在滾動到當前的ListView底部之後有數據分頁到「ImageList」或獲取更多數據的方式,那麼我就是耳朵。 – Optimaximal