Быстро читать в большом количестве данных - PullRequest
0 голосов
/ 21 декабря 2018

Я ищу быстрый способ прочитать примерно 150 Мб спектральных данных, которые у меня есть, в программу, которую я пишу.В настоящее время данные хранятся в текстовом файле (.dat), а их содержимое хранится в формате, подобном следующему:

489.99992 490.000000.011780.01409

, где первые N значений представляют значения x и разделеныпробелами и последними N значениями являются значения y, разделенные символами новой строки.(например, x1 = 489,99999, 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 голосов
/ 21 декабря 2018

попробуйте прочитать все байты из файла одновременно, а затем выполните синтаксический анализ:

Files.readAllBytes(Paths.get(fileName))

, поскольку операция reader.read () в Java обходится дорого.

Вы также можете попробовать окружить свой FileReaderс BufferReader, а затем проверьте, есть ли прирост производительности.

Для получения дополнительной информации перейдите по ссылке:

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

0 голосов
/ 21 декабря 2018

Чтобы оптимизировать код, сначала нужно найти, какие части кода замедляют работу.Используйте профилировщик, чтобы измерить производительность вашего кода и определить, какие части замедляют процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...