我正在寻找一种快速的方法来将我拥有的大约150mb的光谱数据读入正在编写的程序中。数据当前存储在文本文件(.dat)中,其内容以以下格式存储:
489.99992 490.000000.011780.01409
其中前N个值表示x值,并用空格分隔,后N个值是y值,以换行符分隔。 (例如,x1 = 489.99992,x2 = 490.00000,y1 = 0.01178,y2 = 0.01409)。
我编写了以下解析器,
private void parse()
{
FileReader reader = null;
String currentNumber = "";
int indexOfIntensity = 0;
long startTime = System.currentTimeMillis();
try
{
reader = new FileReader(FILE);
char[] chars = new char[65536];
boolean waveNumMode = true;
double valueAsDouble;
//get buffer sized chunks of data from the file
for(int len; (len = reader.read(chars)) > 0;)
{
//parse through the buffer
for(int i = 0; i < len; i++)
{
//is a new number if true
if((chars[i] == ' ' || chars[i] == '\n') && currentNumber != "")
{
try
{
valueAsDouble = Double.parseDouble(currentNumber);
}catch(NumberFormatException nfe)
{
System.out.println("Could not convert to double: " + currentNumber);
currentNumber = "";
continue;
}
if(waveNumMode)
{
//System.out.println("Wavenumber: " + valueAsDouble);
listOfPoints.add(new Tuple(valueAsDouble));
}else
{
//System.out.println("Intensity: " + valueAsDouble);
listOfPoints.get(indexOfIntensity).setIntensityValue(valueAsDouble);
indexOfIntensity++;
}
if(chars[i] == '\n')
{
waveNumMode = false;
}
currentNumber = ""; //clear for the next number
continue;
}
currentNumber += chars[i];
}
}
} catch (IOException e) {
e.printStackTrace();
}
try
{
reader.close();
} catch (IOException e)
{
e.printStackTrace();
}
long stopTime = System.currentTimeMillis();
System.out.println("Execution time: " + ((stopTime - startTime) / 1000.0) + " seconds");
}
,但这大约需要50秒才能完成150mb文件。作为参考,我们正在使用另一种软件,该软件可以在大约半秒内完成此操作(但是它使用自己的自定义文件类型)。我愿意使用其他文件类型,或者如果可以减少执行时间的话,可以使用任何其他类型。我该如何加快速度?
预先感谢
答案 0 :(得分:1)
为了优化代码,您首先需要找到代码的哪些部分在减慢速度。使用探查器来衡量代码的性能,并确定哪些部分在拖延该过程。
答案 1 :(得分:0)
尝试一次从文件中读取所有字节,然后解析:
Files.readAllBytes(Paths.get(fileName))
reader.read()操作在Java中非常昂贵。
您还可以尝试使用BufferReader包围FileReader,然后检查性能是否有所提高。
有关更多信息,请访问链接:
https://www.geeksforgeeks.org/different-ways-reading-text-file-java/