2011-12-14 82 views
1

我在android應用程序中從服務器(20 MB)逐行讀取大文本文件, 在每行向sqlite DB插入一些從此行提取的數據之後等等。從服務器讀取大文本文件android

問題是,這個應用程序大約需要一個小時才能完成讀取這個文件。 說明: 此文件中有400,000行。

我該如何快速執行此操作需要3到4分鐘? 感謝您的幫助。

public void readArData() { 
    try { 
     URL url = new URL("http://10.0.2.2/xy.txt"); 
     BufferedReader in = new BufferedReader(new 
    inputStreamReader(url.openStream())); 
     String str; 
     while ((str = in.readLine()) != null) { 
      // insert into Sqlite DB 
     } 
     in.close(); 
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 

} 

回答

1

文本文件是高度可壓縮的,所以使用Android上提供的gzip壓縮。

其他選項包括:

  • 分裂您的數據集分爲多個文件,再次使用gzip單獨下載

  • 期間播種的數據庫安裝並創建一個同步方法來更新新的記錄,並把移動版本是最新的。\

  • 使用高效的數據庫設計刪除冗餘數據,只下載需要的內容

UPDATE

澄清:

  1. 壓縮服務器上的txt文件。
  2. 更改您的android代碼以將zip文件下載到設備上的本地存儲。
  3. 將本地副本解壓縮到本地存儲。

您現在應該在本地存儲器上有一個txt文件的副本,以便您可以刪除本地zip文件。

  1. 讀取本地txt文件並插入數據庫記錄。

這種方法的主要區別是

一個。您正在下載更少的數據 b。你的下載不會被sql插入中斷。

您也可以嘗試使用事務,以提高插入速度爲Android SQLite database: slow insertion

描述
db.beginTransaction(); 
for (entry : listOfEntries) { 
    db.insert(entry); 
} 
db.setTransactionSuccessful(); 
db.endTransaction(); 
+0

好吧,我會嘗試這個,但從內部存儲讀取比從服務器讀取更快?意味着兩個操作(從內部存儲或從服務器讀取)有很大的不同? – 2011-12-14 22:23:57

2

你確定3 - 4分鐘是可以達到的時間量嗎?我問,因爲你必須:

1)下載該文件的內容 2)分析文件內容, 3)插入到數據庫

一些操作可同時進行,但#1是高度依賴於網絡速度和2/3高度依賴於你有什麼樣的系統資源。

相反,我們可以問爲什麼需要將所有這些數據放到手機中並放到數據庫中?您的應用程序是否存在與託管在包含.txt的網絡服務器上的數據庫相關的問題?你有什麼樣的訪問.txt文件?你可以在服務器上修改它,以便解析可以更快完成?

總之,我認爲我們需要更多數據來分析您的問題。你可以發佈一些.txt文件的例子和你用來解析它的代碼嗎?

+1

您可能需要考慮預處理服務器上的文件,然後將其複製到手機上。我認爲可以將滿載的SQLite數據庫從服務器複製到手機上。 – zostay 2011-12-14 21:58:48

+1

+1,如果你有400,000行並希望在4分鐘內完成,那麼每分鐘就有10萬次SQL插入,每秒1666次。似乎需要從移動設備上詢問很多,特別是如果您還必須進行某種字符串處理。 – kabuko 2011-12-14 22:01:07

0
  1. 確保你的空間在20MB內部存儲或SD卡。
  2. 一次下載文件,如果壓縮更好。 (因爲它會重約3-4mb)
  3. 然後你可以打開它並解析它。使用插入多於一次的查詢(檢查INSERT sqlite語法)。
  4. 刪除該文件。

這種方法也可以讓你恢復中斷的下載,這並不壞。

相關問題