2011-10-13 46 views
0

我維護一個正在收集大量信息的應用程序,並將這些信息存儲在ArrayList中。爲什麼寫入內存中的SQLITE數據庫比使用ArrayList慢得多?

詳細此ArrayList被定義爲ArrayList<FileInformation>其中有像一些成員:

private File mFile; 
private Long mSize; 
private int mCount; 
private Long mFilteredSize; 
private int mFilteredCount; 
private int mNumberOfFilters; 

這種做法是工作,但也不是很靈活的,當我想向大家介紹了一些新的功能。它在內存使用和可擴展性方面也有一些限制。正因爲如此,我做了一些測試,如果數據庫是更好的方法。從靈活性來說,這是毫無疑問的,但不知何故,我無法讓它運行得足夠快,成爲一個真正的選擇。

眼下數據庫只有一個這樣的表:

CREATE TABLE ExtContent (
         "path" TEXT not null, 
         "folderpath" TEXT not null, 
         "filename" TEXT, 
         "extention" TEXT, 
         "size" NUMERIC, 
         "filedate" NUMERIC, 
         "isfolder" INTEGER not null, 
         "firstfound" NUMERIC not null, 
         "lastfound" NUMERIC not null, 
         "filtered" INTEGER not null 
         ); 

性能問題是巨大的。收集和寫作〜14000項需要〜3mins!當寫入數據庫時​​只需寫入ArrayList即可。 在內存中創建數據庫並沒有太大的區別。

由於我在SQLITE方面的經驗相當有限,所以我開始通過android.database.sqlite.SQLiteDatabase.insert方法創建條目。

由於基於文件和內存數據庫之間沒有任何意義的區別,我猜想使用BEGIN TRANSACTIONCOMMIT TRANSACTION不會有什麼區別。

有什麼方法可以優化這種行爲嗎?

回答

1

這是opretty明顯。假設你已經分配了要插入的對象。 (這是機器人解決方案相同的工作負載)讓我們比較選擇:

  • 在ArrayList中插入的作用: - (可選)分配細胞的新裂口,如有需要, 指針 - 插入對象的指針到上月底的數組列表 ......真快
  • 插入源碼: -prepare插入查詢(我希望你用準備好的查詢,並沒有從字符串來構造它) -perform數據庫表中插入與索引等 的修改...很多工作

只有數據庫的好處之一是,你可以: - 後來 查詢 - 它處理外部存儲透明地讓你有更多的實體 但它是以犧牲性能爲代價。

根據你的目的,可能有更好的選擇。

例如,在我的Android遊戲中,我在JSON文件中存儲了高分條目,並利用 GSON Pull解析器/數據綁定層(https://github.com/ko5tik/jsonserializer)從中創建對象。從外部存儲2000條輸入的典型加載時間大約爲2-3秒

+0

該應用程序正在讀取sdcard(或外部存儲)的內容,並正在創建一個清晰的用戶友好視圖。 我有很多想法來進一步改進這個應用程序,但是對於這個基於數據庫的方法來說更加靈活和容易處理。但只要「成本」(就收集數據而言的時間而言)與看起來似乎一樣高,我就無法這樣做...... –

+0

與我的高分系統一樣的用例。我將高分數據作爲JSON存儲在存儲上,並將它們顯示在花哨列表中進行一些過濾/排序。列表模型的數據作爲對象存儲在數組列表和內存中。如果你有很多條目,並且堆內存將會成爲問題,那麼SQLite遊標查詢可能是丟失模型的更好選擇 –

2

我在週末編寫的應用程序中遇到類似問題。

數據庫中的數據是否在發佈時包含在應用程序中?如果是這樣,批量插入不是他們想要的,而是想要創建數據庫並將其包含在assets目錄中並將其複製到設備中。 Here's a great link

否則我不確定你可以做很多事情來提高性能,this link解釋了批量插入到SqlLite數據庫的方法。

編輯:您也可能想要張貼您的insert代碼。

+0

不幸的是,我的應用程序本身並不「知道」數據。該應用程序正在閱讀SD卡(或外部存儲)的內容,並正在創建一個清晰的用戶友好型視圖。 –

3

只是爲了說明,把BEGIN TRANSACTIONEND TRANSACTION會大大提高性能。引用自http://www.sqlite.org/faq.html#q19

SQLite將很容易在一臺普通臺式機上每秒鐘做5萬或更多的INSERT語句。但它每秒只能做幾十個事務。默認情況下,每個INSERT語句是它自己的事務...

相關問題