2011-08-31 83 views
0

我有一個應用程序需要創建和下載一個非常大的SQLite數據庫。根據用戶的數據,創建數據庫和從服務器同步數據可能需要20到25分鐘(某些客戶擁有大量數據)。數據以JSON格式下載,並使用內置JSON類的Android進行處理。從二進制服務器下載大型SQLite數據庫與在設備上創建它

要解決我在某些設備上遇到的OutOfMemory問題,我需要一次將每次通話下載從服務器限制到500條記錄。但是,截至目前,上述所有工作都取得了成功 - 雖然速度很慢。

最近,我的團隊已經在服務器端創建完整的SQLite數據庫,然後以二進制方式將其下載到設備,以加快速度。我從來沒有這樣做過。這確實是一個可行的選擇,或者我應該通過像GSON或Jackson這樣的第三方庫來加速處理JSON。

在此先感謝您的意見。

+1

我假設你已經將GZIP壓縮應用到JSON,同時將其發送到Android客戶端? –

+0

實際上,沒有 - 如果實現更快的JSON庫,這當然可以是整體解決方案的一個元素。但是,單就這一點來說,這並沒有什麼幫助,因爲處理JSON記錄的瓶頸似乎是插入到數據庫中的。無論如何,在改變現有實施之前,我真的很想就我的原始問題提出一些意見。謝謝菲利普的想法。我給了評論和投票。 – SBerg413

回答

0

從我對移動設備的使用經驗來看,重新發明同步在大多數情況下是過度的。這顯然取決於您正在使用的硬件,軟件和數據量。但大多數情況下,移動設備上長時間的操作執行時間是由錯誤的設計,粗心的編碼或未考慮到的嵌入式系統的細節造成的。

不幸的是,我只能給你一些你可能會考慮的提示,因爲你對這些問題的描述很模糊。我的意思是「LOT」對我來說沒有多大意義 - 我已經看到帶有包含數百萬記錄的數據庫的移動應用程序運行得非常順利,並且有大約1K條記錄運行非常緩慢並導致UI凍結的記錄。你也沒有提及你使用的操作系統版本和設備(或者至少它的功能)。什麼是服務器配置,安裝了什麼軟件,使用哪些庫/框架以及使用什麼模式。當你想真正加快速度時,這一切都很重要。

除了被編碼的gzip(我相信你離開默認情況下,這是on),你應該給這個想法一試:

  1. 流! - 確保均爲客戶端和服務器使用JSON API的流媒體版本並使用緩衝流。如果其中任何一個都沒有 - 用一個庫替換它。傑克遜擁有最快的流媒體API之一。編寫一個(de)序列化程序肯定會更麻煩,但是它還是值得的。如果正確完成,雙方都不得創建足夠大的緩衝區,以便對所有數據進行(反)序列化,填充內容,然後解析/寫入。相反,隨着連續的字段序列化,分配更小的緩衝區並逐漸填充。當這個緩衝區被填充時,它的內容被立即發送到數據通道的另一端。在那裏它可以立即被反序列化。該過程一直持續到所有數據都以小塊傳輸。它使數據交換更流暢,資源更少。
  2. 對於大批量插入或更新使用預準備語句。它有時也有助於在沒有約束的情況下插入數據,然後創建它們 - 例如,可以在一次運行中計算索引,而不是爲每個插入計算索引。不要使用事務(它們需要維護額外的數據庫日誌)或提交每300行以最小化開銷。如果您正在更新現有數據庫並且需要進行基本修改 - 將新數據加載到臨時數據庫,並且如果一切正常,則用新的數據庫替換舊數據庫。
  3. 幾乎總是有些數據可以預先計算並存儲在SD卡上。或者它可以作爲公司準備好的SQLite數據庫直接加載到SD卡上。如果某項任務需要的數據量非常大,導致導入時間超過10分鐘,那麼您可能首先不應在移動設備上執行此任務。
相關問題