快速读取大量数据

时间:2018-12-21 17:18:33

标签: java performance

我正在寻找一种快速的方法来将我拥有的大约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文件。作为参考,我们正在使用另一种软件,该软件可以在大约半秒内完成此操作(但是它使用自己的自定义文件类型)。我愿意使用其他文件类型,或者如果可以减少执行时间的话,可以使用任何其他类型。我该如何加快速度?

预先感谢

2 个答案:

答案 0 :(得分:1)

为了优化代码,您首先需要找到代码的哪些部分在减慢速度。使用探查器来衡量代码的性能,并确定哪些部分在拖延该过程。

答案 1 :(得分:0)

尝试一次从文件中读取所有字节,然后解析:

Files.readAllBytes(Paths.get(fileName))

reader.read()操作在Java中非常昂贵。

您还可以尝试使用BufferReader包围FileReader,然后检查性能是否有所提高。

有关更多信息,请访问链接:

https://www.geeksforgeeks.org/different-ways-reading-text-file-java/