Улучшение производительности и скорости ввода-вывода - PullRequest
2 голосов
/ 23 февраля 2012

Мне нужно прочитать и записать огромное количество строк (каждая строка строки длиной 90 символов) из / в сжатый текстовый файл.
Существует также трудоемкая задача для подготовки ввода / вывода, но им можно пренебречь (время ввода-вывода намного больше (профилируется))

Это код, который я использую:

GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(file));
out.write((stringData+NewLineConstant).getBytes());

GZIPInputStream in = new GZIPInputStream(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in),8192);
String data = bufferedReader.readLine();

Проблема занимает слишком много времени.

Это также делается для нескольких файлов, которые используются для сортировки данных (сортировка слиянием).

Что я могу сделать, чтобы значительно улучшить производительность? (без смены оборудования)

1 Ответ

2 голосов
/ 23 февраля 2012

У вас есть какая-либо информация о распределении первых одного или двух символов в этих строках?

Если это так, вы можете прочитать этот большой файл один раз и создать один или два десятка блоков (файлы) на основе только первого или двух символов этих строк.После этого вы можете отсортировать эти сегменты в памяти (эти файлы будут меньше 1 ГБ), если распределение будет равномерным.

Подробно это будет выглядеть так:

  • openбольшой файл (10 ГБ)
  • открывает десятки файлов сегментов для записи (по 1 для каждого типа строк: aa, ab, ...)
  • читает строки большого файла изаписать в файлы корзины
  • закрыть большой файл
  • закрыть файлы корзины
  • отсортировать файлы корзины в памяти (сначала aa, затем ab, ...),это можно распараллелить и добавить их

В общем случае следует увеличить буферы чтения (с 8 КБ до нескольких мегабайт) и буферы записи (с 8 КБ до 256 КБ-512 КБ).

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