Den4xCode
@Den4xCode
Coder

Какой самый быстрый способ прочитать/записать из большого файла?

Есть текстовый файл input.txt, количество строк до 10^5, размер строки 2 и 3 может достигать 10^9 различных эл-ов. остальные строки могут повторятся между собой и их размер 5 эл-ов.

Я использую следующий код:

static String[] getStrings(String fileName) throws Exception {

        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        StringBuilder stringBuilder = new StringBuilder();

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line).append("\n");
        }

//плохая строчка, создает для каждого эл-та строковый объект в куче.
        String[] all_lines = stringBuilder.toString().split("\n");

        bufferedReader.close();

        return all_lines;

    }


Также использовал split() для 2 и 3 строки, что супер не хорошо, ведь при таком коде у меня для млрд элементов в куче создавалось млрд строковых объектов, а это гг для производительности программы.

Наверное нужно использовать byteBuffer, но у меня уже каша в голове, так как сёрфил инет в поисках лучшего решения и слишком много различных выборов на которых нет времени тестировать, если не сложно подскажите решение лучшее на ваш взгляд, буду очень признателен.

Основная задача: максимально быстро прочитать с файла, для 2 и 3 строки нужно интерпретировать как числа, чтобы я мог в дальнейшем обращаться к ним через стек, а не через строки, максимально быстро записать в файл ответ программы.

2 и 3 строки вида: "1 2 33 4 107 11 1000 1007" и т.д. до 10^9 эл-ов.

650ac8bb837f2121157333.png

P.S.:
Вроде бы быстрейший способ это чтение через off-heap метод, а запись через directBuffer, но у меня мало опыта в этом и не уверен что это подходит к конкретно к этой задачи.
  • Вопрос задан
  • 231 просмотр
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Быстрота вне контекста смысла не имеет. Сам по себе вызов FileReader.readLine() достаточно быстрый, чтобы упираться в скорость передачи данных диска. Если вам не хватает скорости, то надо профилировать код, искать узкие места и оптимизировать их. Если узких мест нет, всё работает на пределе возможностей, то придётся смотреть в сторону распределённой обработки данных.

P.S. Обращение к нативной памяти не быстрее, чем к куче, а вот выделяется она на много медленнее, так что в общем случае direct buffer вам не поможет. Если проблема со скоростью только в аллокациях и от них можно отказаться,, например при сквозной передаче считанного с диска в сеть, то стоит использовать канал и zero copy через DMA.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 09:23
5000 руб./за проект
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект