2017-08-10 109 views
-1

有點背景故事:所以我有兩個.txt文件的數據。大約有816行,每行168個字符(166 +新行),這給我們提供了大約13.5MB的數據。現在我必須閱讀這兩個文件並將數據添加到我的數據庫中。我有類DatabaseHelper(它擴展了SqliteOpenHelper,我在那裏工作數據庫)和類Podatek,SkladisceLokacija(以幫助我存儲所有數據很好)。所以主要問題是,如何加速從文件讀取和寫入數據庫?我嘗試了一些我發現的東西,但它只加速了整個過程0.2秒(平均而言,我的Nexus 5x需要10秒)。加快從文件讀取和寫入數據庫

更新:從文件讀取約需要300 ms所以這不能真的快得多,所有子字符串函數獲取約。 2s,以及幾乎所有的時間7s都需要插入到數據庫中。

其中I讀寫代碼:在substring()

try{ 
      FileInputStream fis=null; 
      fis = new FileInputStream(file_skladisca); 
      Charset inputCharset = Charset.forName("windows-1250"); 
      InputStreamReader isr = new InputStreamReader(fis, inputCharset); 
      BufferedReader br = new BufferedReader(isr); 
      String line; 
      fis.getChannel().position(0); 

      FileInputStream fis2=null; 
      fis2 = new FileInputStream(file_lokacije); 
      Charset inputCharset2 = Charset.forName("windows-1250"); 
      InputStreamReader isr2 = new InputStreamReader(fis2, inputCharset2); 
      BufferedReader br2 = new BufferedReader(isr2); 
      String line2; 
      fis2.getChannel().position(0); 

      FileInputStream fis3=null; 
      fis3 = new FileInputStream(file_podatki); 
      Charset inputCharset3 = Charset.forName("windows-1250"); 
      InputStreamReader isr3 = new InputStreamReader(fis3, inputCharset3); 
      BufferedReader br3 = new BufferedReader(isr3); 
      String line3; 
      fis2.getChannel().position(0); 

      SQLiteDatabase dbf = db.getWritableDatabase(); 

      dbf.beginTransaction(); 
      while((line = br.readLine()) != null){ 
       Skladisce skl = new Skladisce(); 
       skl.setIDSkladisca(line.substring(0, idSkl).trim()); 
       skl.setimeSkladisca(line.substring(idSkl, idSklIme).trim()); 
       skl.setVodenjeLokacij(line.substring(idSklIme, idSklImeVodenje).trim()); 

       db.createSkladisce(skl); 
      } 
      while((line2 = br2.readLine()) != null){ 
       Lokacija lok = new Lokacija(); 
       lok.setID_skladisca(line2.substring(0, idSkl).trim()); 
       lok.setID_lokacije(line2.substring(idSkl, idSklLok).trim()); 

       db.createLokacija(lok); 
      } 
      while((line3 = br3.readLine()) != null){ 
       Podatek pod = new Podatek(); 
       pod.setIDSkladisca(line3.substring(0, idSkl).trim()); 
       pod.setSifraPodatka(line3.substring(idSkl, idSklPod).trim()); 
       pod.setCrtnaKoda(line3.substring(idSklPod, idSklPodCrtna).trim()); 
       pod.setImePodatka(line3.substring(idSklPodCrtna, idSklPodCrtnaImePod).trim()); 
       pod.setEnotaMere(line3.substring(idSklPodCrtnaImePod, idSklPodCrtnaImePodEM).trim()); 
       pod.setKnjiznaKolicina(line3.substring(idSklPodCrtnaImePodEM, idSklPodCrtnaImePodEMKK).trim()); 
       pod.setNacinVodenjaSerSt(line3.substring(idSklPodCrtnaImePodEMKK, idSklPodCrtnaImePodEMKKNVS).trim()); 
       db.createPodatek(pod); 
      } 

      dbf.setTransactionSuccessful(); 
      dbf.endTransaction(); 
      dbf.close(); 

      fis3.close(); 
      fis2.close(); 
      fis.close(); 
     } 
     catch (IOException e) {alert_single("Napaka!", "IO Napaka", "Nadaljuj"); 
      e.printStackTrace(); 
      toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);} 
     catch (Exception e) {//alert_single("Napaka!", "Verjetno ste vpisali napačno dolžino polj v datoteki.", "Nadaljuj"); 
      e.printStackTrace(); 
      toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);} 

值只是預定int值,其中從文件I「分裂」的數據(各數據具有以行一定量的字符)。

+需要幾分鐘沒有dbf.beginTransaction(),所以如果您不知道它,這是一件好事。

所以我期待着能夠加快整個過程的一個答案,或者只是一個建議如何以不同的方式做得更好(通過不改變整個結構)。

在此先感謝!

+0

移動設備上的閃存存儲速度很慢。爲什麼你會發布.txt文件而不是完成的數據庫? –

+0

因爲我沒有:)我從其他人那裏得到這些文件,然後我與他們一起操作......並且他們可以只運送文件而不是數據庫,據我所知,但我會嘗試在該方向做些事情,謝謝提出建議。 – varuhan

+0

+我完全忘記了......我無法發送數據庫,因爲在我的設置中,我提供用戶更改每列的長度(這樣他可以準確地指定它爲他自己的數據)...所以我有完全從頭開始構建數據庫... – varuhan

回答

-2

根據這裏的基準,Realm是一個很好的解決方案。 考慮將數據庫更改爲Realm,並且您可以從其提供的更快插入和讀取數據中受益。 但是要小心你爲改變整個應用程序結構而付出的努力和代價。

https://blog.realm.io/realm-for-android/