繁体   English   中英

快速读取大量数据

[英]Quickly read in large amount of data

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

提前致谢

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

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

Files.readAllBytes(Paths.get(fileName))

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM