2010-11-16 29 views
2

我們正試圖在我們的應用程序中集成SQLite,並試圖填充爲緩存。我們計劃將它用作內存數據庫。第一次使用它。我們的應用程序是基於C++的。sqlite sqlite3_close()不釋放獲取的內存

我們的應用程序與主數據庫進行交互以獲取數據並執行大量操作。這些操作通常涉及一個相當龐大的表格。我們複製此表中SQLite和以下是意見:

場數:60號記錄:1,00,000

隨着人口數據開始,應用程序的內存,最多拍攝到大幅〜1.4 GB從120MB。目前我們的應用程序處於閒置狀態,並沒有進行任何重大操作。但通常情況下,一旦操作開始,內存利用率就會上升。現在使用內存數據庫中的SQLite和這種高內存使用情況,我們認爲我們不會支持這些記錄。

現在,當我關閉數據庫使用sqlite3_close(),然後內存不釋放? 我甚至試過放下桌子,但仍然記憶力仍然很高? 需要做些什麼才能讓sqlite釋放獲取的應用程序的內存和內存恢復正常?

回答

1

忘記你的問題的sqlite部分,因爲這個問題適用於Linux下的任何用戶進程。

進程可以通過系統調用brk(2)來增長其數據段。原則上,一個進程稍後可以通過適當調用縮小數據段來釋放該內存。實際上,這是一種創建總線錯誤的神話般的方式,因爲很難確保指向較大數據空間的指針永遠不會被取消引用。

然而,虛擬內存來拯救。進程大小與核心駐留集大小(分別爲szrss,如ps -F所示)之間存在差異。對於最近沒有訪問過內存的進程,rss可能比sz小得多,對於某些正在等待某些事情發生的進程(例如,不活動的getty進程),rss可以爲零,這意味着整個進程地址空間已被換出,以便活動的程序可以使用該內存。

回到你的問題,你不解釋你爲什麼要使用內存數據庫,但是無論你如何運行它,該表都將通過基於磁盤的存儲顯式地通過sqlite結束或通過虛擬內存系統。

+0

我們需要SQLite來加速我們應用程序中的一些進程。該設置是基於Windows的,而SQLite數據庫完全是基於內存的。 – chingupt 2010-11-16 05:58:36

+0

即使表格在磁盤上結束,那麼在調用close()時,佔用的內存也應該恢復正常。不應該嗎? – chingupt 2010-11-16 06:00:19

0

我猜問題已解決。每次查詢執行後,我都沒有執行sqlite3_finalize()。一旦完成,內存大小現在已經大幅降低。