2017-08-10 110 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/