hallo java-freunde!
ich habe ein problem beim einlesen großer textdateien.
und zwar werden einzelne werte in eine db (mySQL) geschrieben:
das textfile hat folgende struktur:
[..]
2004-12-12 13:01:12 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:13 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:14 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:15 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:16 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:17 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
[..]
das einlesen mit meinem java-programm dauert alleine schon bei ca. 100 zeilen á 8 spalten um die
20 sekunden. da eine datei rund 500.000 zeilen beinhalten kann, würde das stunden brauchen, was
deutlich zu lange ist. der ablauf ist folgend: eine zeile wird eingelesen und jeder einzelne wert
in mysql eingeschrieben bzw. die querie dafür in einen vector gespeichert. das zusammenstellen und
einlesen geschieht hier:
diese methode wird von einem thread gestartet, der mir die werte in die db schreibt:
die einzelnen queries werden von mir in einen vector gespeichert und an query_update geschickt:
auch die verwendung von prepare statements brachte keinen wirklichen fortschritt.
wie kann ich meinen java-code optimieren, damit meine daten wesentlich 'schneller'
in die db geschrieben werden können. laut mySQL gibt es den befehl LOAD DATA INFILE,
der ein ganzes File innerhalb von sekunden in eine tabelle einlesen kann. könnte ich
damit evtl. weiterkommen?
wäre hier sehr auf hilfe angewiesen und würde mich freuen, wenn mir ein guter tipp
zum weiterentwickeln gegeben wird.
herzlichen dank,
gondor(..)
edited by thE_29: auch hier abgeteilt
ich habe ein problem beim einlesen großer textdateien.
und zwar werden einzelne werte in eine db (mySQL) geschrieben:
das textfile hat folgende struktur:
[..]
2004-12-12 13:01:12 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:13 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:14 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:15 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:16 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
2004-12-12 13:01:17 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
[..]
das einlesen mit meinem java-programm dauert alleine schon bei ca. 100 zeilen á 8 spalten um die
20 sekunden. da eine datei rund 500.000 zeilen beinhalten kann, würde das stunden brauchen, was
deutlich zu lange ist. der ablauf ist folgend: eine zeile wird eingelesen und jeder einzelne wert
in mysql eingeschrieben bzw. die querie dafür in einen vector gespeichert. das zusammenstellen und
einlesen geschieht hier:
diese methode wird von einem thread gestartet, der mir die werte in die db schreibt:
Code:
private boolean parseData_DateTime(C_ImportFile import_file_, int recordID_) {
System.out.println("C_Import --> parseData_DateTime");
String datetime = "0000-00-00 00:00:00";
/*Error-Flag*/
boolean error_parse = true;
int progress_counter = 0;
/*Sensoren*/
List sensors = null;
/*Sensor-Zeile*/
String buffer = null;
/*File wird gepuffert eingelesen*/
BufferedReader br = null;
Vector query_update = new Vector();
try {
br = new BufferedReader(new FileReader(import_file_.getAbsolutePath()));
/*Sensoren*/
sensors = new Vector();
while ((buffer = br.readLine()) != null && !this.interrupted) {
this.setValue(progress_counter++);
if (buffer.matches("Zeit \\[.*?")) {
/*Header mit Sensoren einlesen*/
sensors = this.parseHeader(buffer);
} else if (!sensors.isEmpty()) {
String[] tokens = buffer.split(this.seperator_property);
for (int i = 0; i < tokens.length; i++) {
SensorHeader header = ((SensorHeader) sensors.get(i));
int sensorID = measurement_sensor.getSensorID(header.getName(), header.getType().getId());
if (header.getType().getId() == C_HeaderConstant.UNIT_TIME_ID) {
datetime = tokens[i];
} else {
String command = "INSERT INTO " + C_SensorValueTable.TableName + " (" + C_SensorValueTable.SensorValueSensorID + ", " +
C_SensorValueTable.SensorValueRecordID + ", " + C_SensorValueTable.SensorValueMeasurementTime + ", " + C_SensorValueTable.SensorValue + ") VALUES (" + sensorID + ", "
+ recordID_ + ", '" + datetime + "', " + Double.parseDouble(tokens[i]) + ");";
query_update.add(command);
}
}
}
}
query_sensor_value.queryUpdate(query_update);
} catch (Exception ex) {
/*** Errorhandling ***********************************/
System.out.println("Error: parseData_DateTime (Exception)");
cat.error("Error: parseData_DateTime (Exception)");
error_parse = false;
}
return error_parse;
}
die einzelnen queries werden von mir in einen vector gespeichert und an query_update geschickt:
Code:
public void queryUpdate(Vector queries_) {
Vector queries = queries_;
Statement st = null;
this.openConnection();
String command = null;
try {
Iterator it = queries.iterator();
while (it.hasNext()) {
st = this.mySQL_connection.createStatement();
st.addBatch(it.next().toString());
st.executeBatch();
}
} catch (SQLException ex) {
/*** Errorhandling ***********************************/
System.out.println("Error: queryUpdate (SQLException)");
cat.error("Error: queryUpdate (SQLException)");
}
this.closeConnection();
}
auch die verwendung von prepare statements brachte keinen wirklichen fortschritt.
wie kann ich meinen java-code optimieren, damit meine daten wesentlich 'schneller'
in die db geschrieben werden können. laut mySQL gibt es den befehl LOAD DATA INFILE,
der ein ganzes File innerhalb von sekunden in eine tabelle einlesen kann. könnte ich
damit evtl. weiterkommen?
wäre hier sehr auf hilfe angewiesen und würde mich freuen, wenn mir ein guter tipp
zum weiterentwickeln gegeben wird.
herzlichen dank,
gondor(..)
edited by thE_29: auch hier abgeteilt