2017-08-10 1 views
-1

Ein wenig Hintergrundgeschichte: so habe ich zwei .txt Dateien mit Daten. Es gibt ca. 81k Zeilen mit jeweils 168 Zeichen (166 + neue Zeile) und das ergibt rund 13,5MB Daten. Jetzt muss ich diese zwei Dateien lesen und Daten in meine Datenbank hinzufügen. Ich habe Klasse DatabaseHelper (die SqliteOpenHelper erweitert, wo ich mit Datenbank arbeite) und Klassen Podatek, Skladisce und Lokacija (um mir zu helfen, alle Daten schön zu speichern). Die Hauptfrage ist also, wie kann ich das Lesen aus der Datei beschleunigen und in die Datenbank schreiben? Ich habe ein paar Dinge ausprobiert, die ich gefunden habe, aber es hat nur den gesamten Prozess um 0.2 Sekunden beschleunigt (im Durchschnitt dauert es 10 Sekunden auf meinem Nexus 5x).Beschleunigen Sie das Lesen von Datei und Schreiben in die Datenbank

Update: Lesen aus Dateien dauert etwa 300 ms so kann dies wirklich nicht viel schneller sein, alle Teilzeichenfunktionen erwerben ca.. 2s, und so ziemlich den Rest der Zeit 7s dauert Einfügen in Datenbank.

-Code, wo wir lesen und schreiben:

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);} 

Werte in substring() vorbestimmt sind nur int Werte, wo ich „split“ Daten aus Dateien (jeweils Daten bestimmte Menge von Zeichen in einer Zeile haben).

+ Es dauert Minuten ohne dbf.beginTransaction(), so ist es eine gute Sache zu erinnern, wenn Sie nicht bereits darüber wissen.

So freue ich mich auf eine Antwort, die den gesamten Prozess beschleunigen würde, oder nur einen Vorschlag, wie es besser anders geht (indem Sie nicht die gesamte Struktur ändern).

Vielen Dank im Voraus!

+0

Der Flash-Speicher auf mobilen Geräten ist langsam. Warum liefern Sie TXT-Dateien anstelle der fertigen Datenbank? –

+0

Weil ich nicht :) Ich bekomme diese Dateien von anderen Leuten und dann operiere ich mit ihnen ... und sie können nur Dateien nicht Datenbanken, soweit ich weiß, aber ich werde versuchen, etwas in diese Richtung zu tun, danke für einen Vorschlag. – varuhan

+0

+ Ich habe total vergessen, dass ... Ich kann nicht liefern Datenbank in, weil in meinen Einstellungen ich Benutzer bieten die Länge jeder Spalte zu ändern (auf diese Weise kann er genau für seine eigenen Daten angeben) ... so habe ich Datenbank komplett von Grund auf neu zu erstellen ... – varuhan

Antwort

-2

Laut dem Benchmark ist Realm eine gute Lösung für Sie. Überlegen Sie, Ihre Datenbank in Realm zu ändern, und Sie können von dem schnelleren Einfügen und Lesen von Daten profitieren. Aber hüte dich vor dem Aufwand und dem Preis, den du zahlen musst, um die ganze Anwendungsstruktur zu ändern.

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

Verwandte Themen