Guten Abend,
das Thema ist gewiss sehr speziell, aber vielleicht kann mir hier trotzdem geholfen werden.
Ich habe eine Textdatei, in der mehrere Hunderttausend binär codierte Werte mit einer Länge von je 4-9 Byte stehen. Diese möchte ich auslesen und in Abhängigkeit eines Wertes in eine von Acht Zieldateien schreiben.
Ein Grundprogramm mit der Funktionalität steht unten. Das Problem bei meinem Programm ist die lange Laufzeit. Je nach Umfang der Quelldatei schafft das Programm 5.000-6.000 Werte / Sekunde.
Leider konnte ich nicht genau lokalisieren, was genau so viel Zeit verbrät.
Vielleicht kann ja mal jemand einen Blick auf den Code werfen und mir Tipps zum Beschleunigen dse Vorgangs geben. Wäre echt super.
Main:
Funktionen unter der Main:
das Thema ist gewiss sehr speziell, aber vielleicht kann mir hier trotzdem geholfen werden.
Ich habe eine Textdatei, in der mehrere Hunderttausend binär codierte Werte mit einer Länge von je 4-9 Byte stehen. Diese möchte ich auslesen und in Abhängigkeit eines Wertes in eine von Acht Zieldateien schreiben.
Ein Grundprogramm mit der Funktionalität steht unten. Das Problem bei meinem Programm ist die lange Laufzeit. Je nach Umfang der Quelldatei schafft das Programm 5.000-6.000 Werte / Sekunde.
Leider konnte ich nicht genau lokalisieren, was genau so viel Zeit verbrät.
Vielleicht kann ja mal jemand einen Blick auf den Code werfen und mir Tipps zum Beschleunigen dse Vorgangs geben. Wäre echt super.
Main:
Java:
long startTime = System.currentTimeMillis();
int indexNumber[] = new int[8];
try(FileInputStream fis = new FileInputStream(fileName);){
int tempValue=0;
int lastCode[] = {-1,-1,-1,-1,-1,-1,-1,-1};
while(fis.available()>0){
int tempCode=0;
int tempChannel=0;
int dataFragment=0;
tempValue=fis.read();
tempCode = tempValue>>6;
tempChannel = (tempValue&0b00111100)>>2;
dataFragment = (tempValue&0b00000011);
array1[tempChannel][tempCode].setChannel(tempChannel);
try(BufferedWriter bwriter = new BufferedWriter(new FileWriter(targetPath+"/Sensor"+tempChannel+".txt",true))){
if(tempCode==0){ // Code 0
extractCode0(array1[tempChannel][0], fis, dataFragment);
indexNumber[tempChannel]++;
lastCode[tempChannel]=0;
bwriter.write(formatOutput(indexNumber[tempChannel], tempCode, tempChannel, array1[tempChannel][tempCode]));
bwriter.newLine();
} else if (tempCode==1){ // Code 1
extractCode1(array1[tempChannel][1], fis, dataFragment);
completeDataCode1(array1[tempChannel][0], array1[tempChannel][1]);
indexNumber[tempChannel]++;
lastCode[tempChannel]=1;
bwriter.write(formatOutput(indexNumber[tempChannel], tempCode, tempChannel, array1[tempChannel][tempCode]));
bwriter.newLine();
} else if (tempCode==2){ // Code 2
extractCode2(array1[tempChannel][2], fis, dataFragment);
indexNumber[tempChannel]++;
if(lastCode[tempChannel]==1){
completeDataCode2(array1[tempChannel][1], array1[tempChannel][2]);
} else if (lastCode[tempChannel]==0){
completeDataCode2(array1[tempChannel][0], array1[tempChannel][2]);
}
bwriter.write(formatOutput(indexNumber[tempChannel], tempCode, tempChannel, array1[tempChannel][tempCode]));
bwriter.newLine();
}
} catch (IOException e5){
System.err.println("Couldn't write to targetfiles.");
e5.printStackTrace();
}
}
} catch (IOException e4){
System.err.println("Couldn't read sourcefile.");
e4.printStackTrace();
};
long endTime = System.currentTimeMillis();
int totalReading=0;
for(int i=0;i<indexNumber.length;i++){
totalReading+=indexNumber[i];
}
long elapsedTime = endTime-startTime;
System.out.println("Read "+totalReading+" values in "+elapsedTime+ " Milliseconds.");
Funktionen unter der Main:
Java:
static void extractCode0(Messwert messwert, FileInputStream fis, int dataFragment) throws IOException{
int valueArray[] = new int[8];
int frequenz=0;
switch(dataFragment){
case 0:
frequenz=1;
break;
case 1:
frequenz=10;
break;
case 2:
frequenz=100;
break;
case 3:
frequenz=1000;
break;
}
messwert.setFreq(frequenz);
for(int i=0;i<valueArray.length;i++){
valueArray[i]=fis.read();
}
int day = valueArray[0]>>3;
messwert.setDay(day);
int month = ((valueArray[0]&0b00000111)<<1)|(valueArray[1]>>7);
messwert.setMonth(month);
int year = valueArray[1]&0b01111111;
messwert.setYear(year);
int hour = valueArray[2]>>3;
messwert.setHour(hour);
int minute = ((valueArray[2]&0b00000111)<<3)|(valueArray[3]>>5);
messwert.setMinute(minute);
int second = ((valueArray[3]&0b00011111)<<1)|(valueArray[4]>>7);
messwert.setSecond(second);
int millisecond = ((valueArray[4]&0b01111111)<<3)|(valueArray[5]>>5);
messwert.setMillisecond(millisecond);
int measurement = ((valueArray[5]&0b00011111)<<10)|(valueArray[6]<<2)|(valueArray[7]>>6);
messwert.setMesswert(measurement/1000.0);
}
Java:
static void extractCode1(Messwert messwert, FileInputStream fis, int dataFragment) throws IOException{
int valueArray[] = new int[4];
for(int i=0;i<valueArray.length;i++){
valueArray[i]=fis.read();
}
int second = dataFragment<<4|(valueArray[0]>>4);
messwert.setSecond(second);
int millisecond = ((valueArray[0]&0b00001111)<<6)|(valueArray[1]>>2);
messwert.setMillisecond(millisecond);
int measurement = ((valueArray[1]&0b00000011)<<13)|(valueArray[2]<<5)|(valueArray[3]>>3);
messwert.setMesswert(measurement/1000.0);
}
Java:
static void extractCode2(Messwert messwert, FileInputStream fis, int dataFragment) throws IOException{
int valueArray[] = new int[3];
for(int i=0;i<valueArray.length;i++){
valueArray[i]=fis.read();
}
int millisecond = dataFragment<<8|valueArray[0];
messwert.setMillisecond(millisecond);
int measurement = (valueArray[1]<<7)|(valueArray[2]>>1);
messwert.setMesswert(measurement/1000.0);
}
Java:
static void completeDataCode1(Messwert dataSource, Messwert dataSink){
dataSink.setFreq(dataSource.getFreq());
dataSink.setDay(dataSource.getDay());
dataSink.setMonth(dataSource.getMonth());
dataSink.setYear(dataSource.getYear());
dataSink.setHour(dataSource.getHour());
dataSink.setMinute(dataSource.getMinute());
}
Java:
static void completeDataCode2(Messwert dataSource, Messwert dataSink){
dataSink.setFreq(dataSource.getFreq());
dataSink.setDay(dataSource.getDay());
dataSink.setMonth(dataSource.getMonth());
dataSink.setYear(dataSource.getYear());
dataSink.setHour(dataSource.getHour());
dataSink.setMinute(dataSource.getMinute());
dataSink.setSecond(dataSource.getSecond());
}
Java:
static String formatOutput(int index, int code, int channel, Messwert data){
char unit;
if(channel<7){
unit = 'V';
} else {
unit = 'A';
}
// Format: index Code Channel Freq DD.MM.YY HH:MM:SS.ms Value
String format = "%d. C%d Kanal %d %dHz %02d.%02d.%02d %02d:%02d:%02d.%03d %.3f%c";
String output = String.format(format, index, code, channel,data.getFreq(),data.getDay(),data.getMonth(),data.getYear(),data.getHour(),data.getMinute(),data.getSecond(),data.getMillisecond(),data.getMesswert(),unit);
return output;
}