Я поддерживаю высокопроизводительный анализатор CSV и стараюсь максимально использовать новейшие технологии для повышения пропускной способности. Для этих конкретных задач это означает:
- Флэш-память (у нас есть относительно недорогая плата PCI-Express, 1 ТБ хранения, которая достигает 1 ГБ/с).
- Несколько ядер (у нас есть дешевый сервер Nehalem с 16 аппаратными потоками)
Первая реализация анализатора CSV была однопоточной. Чтение файлов, декодирование символов, разбиение полей, разбор текста, все в пределах одного потока. Результатом была пропускная способность около 50 МБ/с. Неплохо, но значительно ниже предела хранения...
Вторая реализация использует один поток для чтения файла (на уровне байта), один поток для декодирования символов (от ByteBuffer до CharBuffer) и несколько потоков для синтаксического анализа полей (я имею в виду разбор текстовых полей с разделителями на двойные, целые числа, даты...). Это работает намного быстрее, около 400 МБ/с на нашей коробке.
Но все еще намного ниже производительности нашего хранилища. И эти SSD снова улучшатся в будущем, мы не будем максимально использовать его в Java. Понятно, что текущим ограничением является декодирование символов (CharsetDecoder.read(...)). Это узкое место, на мощном процессоре Nehalem он преобразует байты в символы со скоростью 400 Мбайт/с, довольно хорошо, но это должно быть однопоточным. CharsetDecoder несколько устарел, в зависимости от используемой кодировки, и не поддерживает многопотоковое декодирование.
Итак, мой вопрос к сообществу (и спасибо за то, что вы прочитали сообщение до сих пор): кто-нибудь знает, как распараллеливать операцию декодирования charset в Java?