2012-04-02 83 views
2

我需要將來自10個傳感器的同時讀數以大約100Hz存儲到SQLite數據庫中。這意味着我需要在數據庫中每秒存儲大約1000個讀數。在Android SQLite數據庫中存儲值的最快方法?

我試過把數據庫插入方法放在一個服務在其自己的進程中運行,但我只能收集大約3.5秒的數據。我認爲該服務正在被殺死。

我沒有使用數據庫事務來插入數據。只需單獨調用INSERT INTO ...使用交易至關重要?

是否需要在單獨的進程中運行數據庫插入?我可以在主流程的新線程中運行它們嗎?

如果需要,我可以提供代碼。

回答

4

您需要使用事務處理,並通過在同一事務中執行多個插入操作來「分塊」處理您的請求。你必須使用插入的數量,但我會從每個事務處理1000個插入開始,並從那裏調整它。

如果您想要一次插入一條記錄,事務會非常緩慢。原因是SQLite在完成事務之前等待將數據寫入磁盤,因此必須等待磁盤盤片完全旋轉,在此期間磁盤基本不活動。

在7200 RPM硬盤驅動器上,這基本上限制了每秒60個事務。

http://www.sqlite.org/faq.html#q19

+1

請注意,Android設備沒有7200rpm的硬盤驅動器。 Flash速度很慢,特別是在Android 2.2上,我們被YAFFS2文件系統控制。這就是說,交易仍然是至關重要的,考慮到存儲的速度,交易更是如此。 – CommonsWare 2012-04-02 23:25:14

+0

我不知道你可以把這麼多的插入到一個單一的交易。我會給那一槍。感謝您的快速回復! – wasatch14 2012-04-02 23:42:29

0

我需要從10個傳感器同步讀數存儲到SQLite數據庫在100Hz左右

如果你指的是Android的傳感器,我是你真正能拿到的數據傳遞不確定性給你很快。

我試過把數據庫插入方法在服務以其自身的進程

運行時,不要使用一個單獨的進程。你正在增加開銷,沒有任何好處。

從您的傳感器註冊的任何組件中執行您的數據庫I/O。如果這是一項服務,沒問題。

我只能收集大約3.5秒的數據。我認爲該服務正在被殺死。

然後你有更大的問題。包含運行服務的進程在啓動後3.5秒內不會被終止。不知怎的,你的服務實現是搞砸了。

我沒有使用數據庫事務插入數據

哈維先生所指出的,交易是對性能至關重要。

使用交易至關重要嗎?

是的。

是否需要在單獨的進程中運行數據庫插入?

不僅沒有必要,它接近荒謬。

我可以在主流程的新線程中運行嗎?

是的。

+0

我從通過藍牙發送信號的Arduino微處理器讀取數據。我使用BroadcastReceiver的onReceive()方法捕獲讀數並將其發送到數據庫。 – wasatch14 2012-04-02 23:41:30

+0

@ wasatch14:「我正在使用BroadcastReceiver的onReceive()方法來捕獲讀數並將它們發送到數據庫」 - 我能看到這個工作的唯一方法就是如果你有''BroadcastReceiver'註冊了'Service'通過'registerReceiver()'。該服務將分派一個監聽LinkedBlockingQueue的線程來聚合數據並使用事務將其清空到數據庫。 – CommonsWare 2012-04-02 23:47:48

相關問題