Lesen von sehr großen dateien

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo,
ich möchte eine etwa 3 MB große CSVdatei einlesen,bestehend aus etwa 200.000 Zeilen und 3 Spalten einlesen

Folgende readFile Methode,die auch funktioniert:

Code:
public boolean readFile(String filename) {
		// alle zeilen löschen,falls schon was da war
		rows = new ArrayList<Row>();
		String zeile = "";
		String split[] = null;
		int zeilenNummer = 0;
		boolean isInsert = false;
		try {
			FileReader file = new FileReader(filename);
			BufferedReader data = new BufferedReader(file);
			// zeilenweise lesen
			while ((zeile = data.readLine()) != null) {
				// neues zeielnobjekt
				Row myZeile = new Row(++zeilenNummer);
				split = zeile.split(",\""); // Feldtrenner

				for (int i = 0; i < split.length; i++) {

					// leere Zeile ignorieren
					if (!split[i].equals("")) {
						// eventuell Leerzeilen zwischen zwei ; entfernen
						// und Spalten ins zeilenobjekt packen
						// die erste Zeile enthaelt immer die Spaltenbezeichner
						isInsert = myZeile.insertColumn(split[i].replaceAll("\"", ""));
					}
				}
				// Zeile in die zeilen-liste
				isInsert = this.rows.add(myZeile);
			}
		} catch (FileNotFoundException e1) {
			System.out.println("");
			System.out.println("Datei existiert nicht");
			isInsert = false;
		} catch (IOException e2) {
			System.out.println("");
			System.out.println("Fehler beim Lesen der Datei");
			isInsert = false;
		}
		return isInsert;
	}

Das Problem:ich benötige für das einlesen der 3Mb großen datei etwa zwsichen 4-5 Sekunden (P4 2,6 Ghz und 256MB Ram) Was ziemlich lange ist,wie ich meine. die meiste Zeit etwa 3 Sekunden brauche ich für:
isInsert = myZeile.insertColumn(split.replaceAll("\"", "")); -->replaceAll schluckt etwa 2 Sekunden !!!!!!!!!!!

Hat jemand eine Idee warum das sol lange dauert,bzw. einen Vorschlag wie man es schöner/schneller machen könnte

das replaceAll brauche ich,um Hochkommatas zu entfernen,die sollen nicht mit gespeichert werden,stehen in der CVS datei als Texttrenner

eine zeile sieht etwa so aus: "Spalte1","Spalte2","Spalte3"

Gruß
und danke für eure Hilfe
sky

*codetags eingefügt*
-Wildcard-
 

Marco13

Top Contributor
Wenn es extrem auf Geschwindigkeit ankommt, kann man vieles von dem, was dort mit den einzelnen Zeilen gemacht wird, "per Hand" machen (etwas umständlicher, aber ggf. effizienter). Das replaceAll ist da - siehe maki - schon ein heißer Kandidat. Evtl. könnte man auch das "split" per Hand nachbauen, aber man müßte im Profiler nachsehen und ggf. teste, ob sich das lohnt. Ein Kleinigkeit wäre vielleicht noch sowas wie
rows = new ArrayList<Row>(anzahlZeilen);
wenn man die Anzahl vorher schon kennt.

Aber weswegen ich eigentlich antworte :D : Das isInsert wird vermutlich (!) nicht das machen, was es soll. Es bezieht sich ja immer nur auf die letzte Operation (und insbesondere liefert rows.add(..) IMMER true).
 
G

Guest

Gast
Hi

Einwand durchaus korrekt,

wobei isInsert im tryBlock eigentlich immer true zurück gibt:

in der Klasse Row:
ArrayList columns=null;
public Row() {

this.columns = new ArrayList<String>();
}
public boolean insertColumn(String column) {
return this.columns.add(column); //--->add:gibt immer true sollte es,wenn alles richtig initialisiert ist und das ist es

}

von daher gibt das isInsert immer true zurück wenn keine Exception ausgelöst wurde,wir uns also im try Block befinden,ansonsten ist isInsert immer false im catch Block

macht also doch Sinn.

man könnte im try Block auch direkt isInsert=true setzen,aber wenn meine Methoden schon einen Rückgabewert haben,dann kann man diesen auch auswerten...das war meine Absicht dahinter.

Du hast aber Recht : isInsert = myZeile.insertColumn(split.replace("\"", "")); bezieht sich auf die letzte Operation.Aber ich gehe mal davon aus,wenn irgendwo ein false auftritt beim insertColumn,dann überall,sonst ist es immer true....


Oder ist das nicht schöner Programmiestil.
Bin für Vorschläge immer offen


zum eigentlichen Problem:

achso nur String replace() statt replaceAll hat nur minimalen Einfluss auf die geschwindigkeit
Merwürdig ist auch,dass ich beim ersten Kompilieren bei 6,7,8, oder gar 9 Sekuden liege.nach dem 3./4./5.Start dann bei 4-5 Sekunden. hat jemand eine Idee,warum der große Unterschied von ca.2-4 Sekunden ????

lieben Gruß

und danke euch
 

Marco13

Top Contributor
Anonymous hat gesagt.:
man könnte im try Block auch direkt isInsert=true setzen,aber wenn meine Methoden schon einen Rückgabewert haben,dann kann man diesen auch auswerten...
Nicht wenn dadurch eine Bedeutung für isInsert suggeriert wird, die es nicht hat! :shock: Wenn ich das jetzt richtig verstanden habe, soll es ja quasi "zurückgeben, ob keine Exception aufgetreten ist". Das KANN zwar OK sein, aber mönnte man eindeutiger und verständlicher schreiben als
Code:
try
{
....
}
catch (...Exceptions )
{
    return false;
}
return true;

achso nur String replace() statt replaceAll hat nur minimalen Einfluss auf die geschwindigkeit

Ja, vermutlich wäre es eben schneller, das per Hand zu machen. Man weiß jetzt auch nicht, was "insertColumn" genau macht, aber wenn DAS nicht zeitkritisch ist, könntest du ggf. sowas machen wie
Code:
zeile = ...
Row row = new Row(++zeilenNummer);
String currentToken = "";
for (int i=0; i<zeile.length(); i++)
{
    if (zeile.charAt(i) == '\"' || zeile.charAt(i) == ',') // Feldtrenner
    {
        if (currentToken.length() > 0)
        {
            row.insertColumn(currentToken);
        }
        currentToken = "";
    }
    else // Jetzt gilt auch immer: if (zeile.charAt(i) != '\"') // "replaceAll"
    {
        currentToken += zeile.charAt(i);
    }
}
if (currentToken.length() > 0)
{
    row.insertColumn(currentToken);
}
Man könnte da evtl. NOCH mehr tweaken, wenn man mit einem StringBuffer oder einen char-Array arbeitet, aber vermutlich hängt das dann auch davon ab, wie lang die Zeilen sind usw.
 
G

Guest

Gast
Hallo
danke dir..zur isInsert Geschichte hast du mich überzeugt, ist eine gültige Begründung!! Werd ich wohl so machen

und zur Performace-geschichte..danke für den Tip..werd ich später mal ausprobieren...
 

Janus

Bekanntes Mitglied
ich würd schon String#split verwenden, um mir den string zu zerlegen. aber auf String#replace/replaceAll kann man bei der vorgabe vollständig verzichten und String#substring verwenden. das ist wesentlich schneller und man die meisten string-vergleiche weglassen.

Code:
// halb pseudo
String[] tokens = line.split( ";" );
for( String token : tokens )
{
   token = token.trim();
   if( token.length() > 2 )
   {
      // zwei quotes + mind. 1 zeichen => länge größer 2 = token hat inhalt
      token = token.substring( 1, token.length() - 1 );
      // add token
   }
}
 

Marco13

Top Contributor
Hmnaja - String#spilt verwendet ja auch Regular expressions. Und die SIND teuer. Speziell wenn es nur um einzelne Zeichen geht, an denen gesplittet wird (bzw. bei replace/replaceAll nur einzelne Zeichen weggelassen werden sollen) kann man sehr performant beides "in einem Rutsch" erledigen, indem man einfach einmal durch den String läuft, und mit "elementaren String-Operationen" alles macht, was gemacht werden muss.
 
G

Guest

Gast
Hallo,

großes KINO Marco13 :applaus: :applaus: :applaus: :applaus:

Habe deinen Code ausgetestet und siehe da gegenüber split und replace Varainte ca. 2 sekunden Ersparnis..lieg nun beim einlesen einer ca:3MB großen datei bei 2 Sekunden.vorher waren es ca: 4 Sekunden.

Und mein Rechner ist dann noch nicht ganz der schnellste..auf einem Rechner mit Intel Core2Quad Prozessore (2.4
bzw. teilweise 2.66 GHz) bin ich bei der ersten Variante mit split und replace schon bei 2 Sekunden gewesen....:D

Echt Klasse.

Danke für eure coolen Tipps.

:toll: :applaus: :toll:

lieben Gruß

und DANKE,hoffe kann auch mal so schöne Tips geben,aber daran arbeite ich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Excel lesen wie CSV Allgemeine Java-Themen 7
S Textdatei statt von Dateisystem aus .jar lesen Allgemeine Java-Themen 3
oskarS85 GeoTiff NDVI pixelweise lesen Allgemeine Java-Themen 2
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
OnDemand CSV lesen flexible Spalten Allgemeine Java-Themen 3
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
G Excel Tabelle lesen und in neue Excel Tabelle einfügen Allgemeine Java-Themen 11
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
A File lesen Codierung Charset Allgemeine Java-Themen 5
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
B Quellcode lesen - Aussortieren Allgemeine Java-Themen 3
A Steuerung von Spiel aus Datei lesen Allgemeine Java-Themen 0
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
OnDemand Java Barcode lesen Allgemeine Java-Themen 4
F Json in sql speichern und lesen Allgemeine Java-Themen 10
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
H Input/Output .txt Datei in Jar lesen Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
RalleYTN REST API ResponseType application/pdf lesen Allgemeine Java-Themen 0
R Inputstream lesen mit Pointer Allgemeine Java-Themen 0
I Setzen und Lesen eines Objektes (Enum?) Allgemeine Java-Themen 10
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
D Datentyp von Unbounded Wildcards lesen Allgemeine Java-Themen 2
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
B SMS von Vodafone Mobile Connest mit JAVA-Programm lesen Allgemeine Java-Themen 0
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
L Input/Output Datei in den Speicher lesen. Allgemeine Java-Themen 9
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
F Java Bytecode lesen Allgemeine Java-Themen 5
W Schreiben/Lesen aus RS232 / jssc Allgemeine Java-Themen 0
L Input/Output Datei lesen Allgemeine Java-Themen 1
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
OnDemand Lesen aus Properties Allgemeine Java-Themen 7
S XML lesen, verarbeiten, speichern klappt in Eclipse, aber nicht in der JAR Allgemeine Java-Themen 4
N Content von URL lesen Allgemeine Java-Themen 18
T UTF-16LE String aus LDAP lesen und als ISO-8859-1 in DB speichern? Allgemeine Java-Themen 2
J Bytes aus Socket lesen Allgemeine Java-Themen 9
M Aus Excel Tabelle lesen und Werte in Array speichern Allgemeine Java-Themen 15
W Passwortgeschuetzte .mpp Datei mit MPXJ lesen Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
G Binäre Datei lesen / schreiben Allgemeine Java-Themen 9
E Apache POI-Datei lesen und umschreiben Allgemeine Java-Themen 8
T Welches Tuturial soll ich paralell lesen ? Allgemeine Java-Themen 3
T Datei lesen, bearbeiten, speichern Allgemeine Java-Themen 14
T Kann HTML Datei nicht lesen Allgemeine Java-Themen 3
S Die Zeile die JUnit gerade ausführt lesen Allgemeine Java-Themen 15
A nur einen Wert aus einer .conf lesen und erneuern Allgemeine Java-Themen 3
H Input/Output InputStream: 32-Bit-Ganzzahl (DWORD) binär lesen Allgemeine Java-Themen 5
B Hex aus .txt lesen Allgemeine Java-Themen 8
C Datentypen von string in ein array lesen Allgemeine Java-Themen 4
C aus einem String einzelne Hex Werte lesen Allgemeine Java-Themen 7
D Ausgabe von C# Konsolenanwendung lesen Allgemeine Java-Themen 5
F CSV-Datei aus Internet lesen Allgemeine Java-Themen 2
P ObjectInputStream kann nicht vernünftig lesen... Allgemeine Java-Themen 9
R Datei zeilenweise lesen und schreiben Allgemeine Java-Themen 6
0 Datein aus laufender Jar lesen und bearbeiten Allgemeine Java-Themen 10
S Dateien aus src-Ordner lesen Allgemeine Java-Themen 3
F hex-farbwert der pixel aus bildern lesen Allgemeine Java-Themen 4
L Wikipedia Artikel lesen Allgemeine Java-Themen 16
J HSSF - schreiben in und lesen aus vorhandener Datei Allgemeine Java-Themen 6
R Properties Datei aus Applikationsverzeichnis lesen Allgemeine Java-Themen 5
J xlsx Dateien lesen OHNE apache POI Allgemeine Java-Themen 6
C Property-File lesen und schreiben Allgemeine Java-Themen 20
M Binäre Datei schreiben und lesen Allgemeine Java-Themen 4
N Problem beim lesen einer File in JAR-File Allgemeine Java-Themen 3
D Datei lesen ohne sie für umbenennen/verschieben zu sperren Allgemeine Java-Themen 13
reibi Sicher ein File lesen Allgemeine Java-Themen 28
R Java lesen von Dateien, Little-Endian Allgemeine Java-Themen 2
N Performates lesen von Objekten aus Dateien Allgemeine Java-Themen 2
T Integer aus InputStream lesen Allgemeine Java-Themen 3
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
D Probleme beim schreiben / lesen in TreeMap Allgemeine Java-Themen 9
D (Viele) Daten performant speichern und lesen Allgemeine Java-Themen 5
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
brunothg Iso lesen Allgemeine Java-Themen 2
B PDF lesen funktioniert bei bestimmten Dateien nicht mit pdfview Allgemeine Java-Themen 4
C Markierung durch Maus lesen Allgemeine Java-Themen 9
nrg JDOM Tabelle lesen Allgemeine Java-Themen 6
P Datei in einen String lesen Probleme bei Codierung Allgemeine Java-Themen 2
L Grafik lesen Allgemeine Java-Themen 2
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
H POI Excel lesen und schreiben Allgemeine Java-Themen 10
Iron Monkey Object in Datei effizienter lesen / schreiben Allgemeine Java-Themen 13
L Lesen von Objekten aus Datei Allgemeine Java-Themen 17
M PCL Stream lesen und schreiben Allgemeine Java-Themen 6
U Java file aus Classpath lesen Allgemeine Java-Themen 1
L Applet Verzeichnis lesen Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben