2011-09-28 128 views
4

我正在開發一個嵌入式系統,它需要非常頻繁地存儲和檢索數據。我預計每秒可能有100個寫入和10個讀取。數據將以連發形式出現,而不是連續出現。高性能SQLite選項

我想使用SQLite來存儲所有這些數據,但由於它是一個閃存文件系統,寫入(INSERTS & UPDATES)太慢了。我嘗試設置synchronous = off,這確實可以提高性能,但是我對於破壞數據庫感到緊張。

在我的應用程序中,電源故障將是一種罕見但實際的可能性。我可以忍受失去一些最近的數據,但絕對不能冒損失數據庫損壞導致的所有數據的風險。

我也想過用一個內存中的SQLite數據庫作爲主數據庫,並定期同步到文件系統中Synchronizing sqlite database from memory to file

討論是否有我應該考慮其他的選擇嗎?

+0

>>'我絕對不會冒險因爲數據庫損壞而丟失所有數據......我可以忍受丟失一些最近的數據......「<<這將建議一個解決方案,您定期與外部數據庫或導出,這取決於您禁用SQLite中的哪些安全功能以獲得更高的插入速度,從而增加數據丟失而無需恢復的風險。 – Tim

回答

5

當一連串的數據到達時,一定要在單個事務中執行一系列的插入和更新操作。

sqlite3_exec(handle, "BEGIN TRANSACTION", NULL, NULL, NULL); 

for (...) { 
    // Do your inserts/updates 
} 

sqlite3_exec(handle, "END TRANSACTION", NULL, NULL, NULL); 

默認情況下,SQLite會將每個插入/更新放入其自己的事務中。如果底層文件系統很慢,這會使SQLite非常慢。通過聲明自己的事務,可以顯着減少對文件系統執行的實際寫入量,從而大大提高SQLite的性能。

+0

我意識到單個命令在事務之外的性能損失,並且我在測試中使用了這個。然而,在應用程序中,由於數據將作爲流接收,因此不清楚事務邊界應該發生在哪裏。可能最終由蒸汽插入和/或超時的數量劃定界限。 – mccleanp

1

我不知道你的數據集有多大,但是如果它們不太大,那麼WAL模式可能會有所幫助。您可以使用"PRAGMA synchronous=1"進行試驗:此設置在每次交易後都不會同步,但偶爾會發生。 (默認值:寫入2 MB新數據時)SQLite文檔說,您可能會丟失一些最近的事務,但數據庫不會損壞。