簡體   English   中英

在iphone中使用sqlite數據庫時的內存管理

[英]Memory management when using sqlite database in iphone

我的應用程序使用SQLite數據庫來存儲用戶的輸入。 輸入中的記錄數將大約為100條記錄,我在應用程序中進行了大量的SQL操作。

當我使用Object Allocations運行應用程序時,它會顯示sqlite庫libsqlite3.0.dylib占用大量內存。 libsqlite框架會導致內存泄漏嗎? 與數據庫通信的最佳方式是什么? 進行大量的SQL調用會增加我的應用程序的內存使用量。

有人可以讓我知道在應用程序中有效使用sqlite的最佳方法。 (我使用SQLiteBooks示例作為參考)

謝謝。

Sqlite為請求使用緩存。 關閉並重新打開數據庫,以釋放緩存。

除非你的記憶要求很高,否則你不應該在乎。

您可以在UIApplicationDelegate方法applicationDidReceiveMemoryWarningUIViewController委托方法didReceiveMemoryWarning中捕獲關鍵條件

如果調用其中一個方法,請關閉並重新打開數據庫。

我沒有看到由sqlite引起的任何內存泄漏。 它確實使用了一塊合理的內存,但想想你需要編寫多少代碼以及需要緩存的數據來做同樣的事情......

最好的建議是使用高效的SQL並盡快重置語句句柄。 完成准備好的陳述也可能有所幫助,盡管我沒有發現需要這樣做。

人們經常建議定期關閉並重新打開數據庫。 雖然這不會傷害我自己也沒有看到任何實際的好處。

最后,在sqlite網站上,您將看到有關管理內存功能的討論。 這些聲音非常誘人,直到您意識到它們是可選的並且未在iPhone上的默認構建中啟用。

當連續執行多次INSERT(> 1000)時,我已經在SQLite中使用了內存。 寫性能也很慢。 通過在事務中包裝執行INSERT的循環,幾乎完全消除了這些問題。 為了回答這個問題,我發布了一些示例代碼。

真的想限制iphone應用程序中sqlite的緩存大小。 啟動應用程序並初始化數據庫時,運行如下命令:

const char *pragmaSql = "PRAGMA cache_size = 50";
if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) {
    NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database));
}

這將阻止sqlite緩存您的查詢並慢慢消耗所有內存。

我之前因為索引不佳而有一個相對較大的數據庫時,我看到內存使用量激增。 如果您在數據庫中添加一些經過深思熟慮的索引,則可以快速輕松地在現實世界中恢復內存使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM