Große Dateien schnell einlesen

Status
Nicht offen für weitere Antworten.

Fian03

Mitglied
Hallo

mein Programm öffnet Dateien um sie dann zu bearbeiten und zu speichern. Allerdings sind manche Dateien relativ groß (ca. 20 MB) und mein Programm braucht eine Ewigkeit um die Datei zu öffnen und sie in eine Variable zu speichern.

Ich realisiere das momentan mit einem FileReader.

Kennt jemand eine möglichkeit das einlesen zu beschleunigen? Oder kann es vielleicht sein das es am Eclipse hängt?

Hier ist der Teil um den es sich Handelt:

try
{
br = new BufferedReader(new FileReader(f));
while((line = br.readLine())!= null)
{
Zaehler = Zaehler + 1;
strFile = strFile + line;
}
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.append("Datei erfolgreich geöffnet!\n");
br.close();
}
catch(FileNotFoundException fnfe)
{
textArea.append("Datei nicht gefunden...\n" + fnfe);
}
catch(IOException io)
{
textArea.append("Probleme beim Lesen...\n" + io);
}



Vielen Dank im Vorraus

Gruß Fian03
 

Stefan1200

Top Contributor
Fian03 hat gesagt.:
Kennt jemand eine möglichkeit das einlesen zu beschleunigen?
Gruß Fian03

Meines wissens nach gibt es zwei hauptsächliche Dinge, die man extrem Beschleunigen kann, wenn man eine Datei in einen String einlesen möchte.
Zum Einen, wenn man den BufferedReader benutzt, das machst du ja schon. Zum Anderen sollte man zuerst nicht in einen String speichern!!!
Stattdessen sollte man einen StringBuffer verwenden. Nach dem Einlesen der Datei kann aber problemlos aus einem StringBuffer ein normaler String gemacht werden, falls einem nicht auch die Möglichkeiten mit dem StringBuffer reichen.

Laut deinem Source sieht es aus, als würde die Variable strFile ein normaler String sein, der immer erweitert wird. Gerade dieses Verfahren geht beim StringBuffer ein vielfaches schneller. Wenn du aus strFile ein StringBuffer machst, dann sieht deine while schleife wie folgt aus:

while((line = br.readLine())!= null)
{
Zaehler = Zaehler + 1;
strFile.append(line);
}

Den Zaehler = Zaehler + 1; würde ich eventuell gegen ein Zaehler++; austauschen, bringt aber keinen oder kaum ein Geschwindigkeitszuwachs.
 

Nobody

Top Contributor
Fian03 hat gesagt.:
StringBuffer.indexOf

wenn du auf diesen index zugreifst und das gesuchte objekt nicht vorhanden ist, versucht er auf die stelle -1 zu zugreifen. da ich jetzt den genauen code nicht kenne, kann ich nicht sagen ob es daran liegt.
 

Stefan1200

Top Contributor
Fian03 hat gesagt.:
Danke für den Tip! Ich habe es gleich ausprobiert.

Allerdings bekomme ich dann eine "java.lang.NullPointerException".

Das einzige was ich mit dem StringBuffer noch mache ist StringBuffer.indexOf und StringBuffer.substring. Ich verstehe nicht wo er auf ein Objekt zugreifen will das er nicht kennt (Das beudeutet diese Fehlermeldung doch, oder?)

Paste doch nochmal den Source (komplett) nachdem du den StringBuffer eingebaut hast. Was ist denn in der Zeile, wo der NullPointer auftritt?
Jup, NullPointer kommt dann zum Beispiel, wenn du eine Variable auslesen möchtest, in der null (nicht als String) drinn steht.

Und ich hoffe du hast nicht wirklich StringBuffer.indexOf im Source stehen, sondern strFile.indexOf und strFile.substring
 

Fian03

Mitglied
Ich hatte gehofft dass ich meinen Beitrag wieder schnell genug raus genommen habe, aber trotzdem Danke für eure schnelle Hilfe.

Ich war nur zu doof den StringBuffer richtig zu deklarieren.

statt StringBuffer sb = new Stringbuffer;

habe ich geschrieben

StrinBuffer sb;

das geht natürlich nicht!!!

SORRY :oops:
 

Stefan1200

Top Contributor
Und wie groß ist der Geschwindigkeitsunterschied mit dem StringBuffer?
Würde mich jetzt doch mal interessieren :)
 

Fian03

Mitglied
Ich kann es dir nicht genau sagen.

Bei einem File von 21.5 KB geht es schon merklich schneller. An mein 20 MB - File habe ich mich noch nicht ran getraut. :)
 

Stefan1200

Top Contributor
Fian03 hat gesagt.:
Ich kann es dir nicht genau sagen.

Bei einem File von 21.5 KB geht es schon merklich schneller. An mein 20 MB - File habe ich mich noch nicht ran getraut. :)

Also ich habe mal ein halbwegs sinnloses Programm geschrieben, das ein selbst eingebbaren String so oft in eine Datei schreibt, wie man angegeben hat. Und wenn ich da ein Umweg einbaue, in dem ich die Textdatei vor dem schreiben in die Datei erst in einer Variable zusammen baue, gab es zwischen dem String und StringBuffer extreme unterschiede.
In diesem Beispiel ist es natürlich intelligenter gleich den String in eine Datei zu schreiben, und die Anweisung in eine Schleife zu packen, aber es war ja auch mehr ein Test, bzw. Übung.

Interessant ist auch, das die Java Version von diesem Programm schneller war, als eine RealBasic Version, obwohl der Sourcecode genauso war (abgesehen von der Java <-> Basic Syntax Unterschiede). Aber die Java Version war in der Regel eine Sekunde schneller :)

Also soll mir nochmal einer Sagen, Java ist vom Prinzip her langsam :)
Java ist jedenfalls schneller als Basic *g* :)
 

omosde

Mitglied
Hi,

kann dazu auch was sagen, war naemlich auch neugierig und hab das mal ausprobiert!

Als Datei die Window.java (etwa 75KB) gewaehlt und ab!

String: 35766 im Mittel
StringBuffer: 178 ms im Mittel

Das sind doch schon gravierende Unterschiede! Faktor 200! Wau!

Nicht wundern, arbeite auf nem 300 Mhz Rechner unter Debian!

Interessante Zahlen!
 

Fian03

Mitglied
Stimmt, es ist wirklich gewaltig schneller.
Ich bekomme zwar jetzt einen java.lang.OutOfMemoryError aber ich bekomme den Fehler schnell :lol:
Vorher bin ich gar nicht so weit gekommen :D
 

Nobody

Top Contributor
dann braucht dein programm wohl etwas viel speicher, hier hilft nur speichermenge erweitern (wurde in nem anderen thread beantwortet)
 

marsias

Aktives Mitglied
Hi!

Wenn man string um string erweiter, wandelt java intern den string in einen stringbuffer um
erweitert den und wandelt ihn wieder in string um....das sagt doch alles eigentlich.
also leute wenn viel rumgemache mit strings dann stringbuffer nehmen :D

mfg
 

Nobody

Top Contributor
marsias hat gesagt.:
Hi!

Wenn man string um string erweiter, wandelt java intern den string in einen stringbuffer um
erweitert den und wandelt ihn wieder in string um....das sagt doch alles eigentlich.
also leute wenn viel rumgemache mit strings dann stringbuffer nehmen :D

mfg


bei einfachen operationen ist der stringbuffer relativ langsam, daher empfiehlt sich immer die abwägung zwischen stringbuffer und dem normalen string. im zweifelsfall hilft zeitenvergleich
 

aquanox

Mitglied
Hi,

schonmal überlegt das ganze Zeichenweise einzulesen? Dann übergehst du den String von readline:

Code:
try
{
  br = new BufferedReader(new FileReader(f));

  StringBuffer sb = new StringBuffer();
  char c;

  while(true) // Die Abfrage kommt dann später
  {
    c = br.read();
    
    if(c == '\r') // Wagenrücklauf, wird übergangen (bei readline nicht nötig)
    {
      continue;
    }
    else if((c == '\n') || (c == -1))  // Zeile ist vorbei oder Dateiende
    {
      Zaehler++; // entspricht Zaehler = Zaehler + 1

      if(c == -1)
      {
         break; // Datei ist zu Ende, jetzt wird das while verlassen
       }
    }
    else
    {
       sb.append(c);  // zeichen anhängen
    }
  }

  strFile = sb.toString();
  
  textArea.setLineWrap(true);
  textArea.setWrapStyleWord(true);
  textArea.append("Datei erfolgreich geöffnet!\n");
  br.close();
}
catch(FileNotFoundException fnfe)
{
  textArea.append("Datei nicht gefunden...\n" + fnfe);
}
catch(IOException io)
{
  textArea.append("Probleme beim Lesen...\n" + io);
}
 

Nobody

Top Contributor
eine endlosschleife ist nicht serh elegant. besser wäre es c vorzubelegen und dann die abfrage ins while mit reinzunehmen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
M Große Dateien laden Allgemeine Java-Themen 2
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
N Das große O berechnen Allgemeine Java-Themen 2
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
D große Textdatei filtern Allgemeine Java-Themen 13
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
R POI große Exceldatei schreiben Allgemeine Java-Themen 7
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
trash Das große Problem: .jar Archiv Allgemeine Java-Themen 19
J Große Datei einlesen und gestückelt verarbeiten Allgemeine Java-Themen 4
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
P große double Zahlen und modulo Allgemeine Java-Themen 8
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
A Mit RegEx große Dokumente erfassen Allgemeine Java-Themen 14
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
I JNI - Große Daten übertragen Allgemeine Java-Themen 6
T Große Dateibestände löschen - Speicherproblem Allgemeine Java-Themen 20
S Große ArrayListen Allgemeine Java-Themen 8
S große Datei einlesen! Allgemeine Java-Themen 7
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
H Referenzen statt Objekte für große Speicherstrukturen Allgemeine Java-Themen 19
K Große Herausforderung Allgemeine Java-Themen 2
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
D Große Klasse - was fällt euch so ins Auge? Kritik bitte! Allgemeine Java-Themen 10
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
X Dateien für Benutzer Sperren Allgemeine Java-Themen 4
D Dateien aus den Internet herunterladen Allgemeine Java-Themen 6
L Methoden Dateien älter als 30 Tage? Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
J Java .jar Dateien zusammenführen Allgemeine Java-Themen 1
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
Ananaskirsche Input/Output Dateien im Ordner Allgemeine Java-Themen 8
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
X Herunterladen von Dateien aus dem Internet Allgemeine Java-Themen 2
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
H PDFBox akzeptiert Dateien nicht Allgemeine Java-Themen 1
B Java - einlesen von Dateien und herausschneiden von XML Dokumenten Allgemeine Java-Themen 5
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben