Java: анализировать текст в примитивные числа без создания экземпляра объекта

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

Цель состоит в том, чтобы извлечь данные как можно быстрее и свести к минимуму активность сборщика мусора. Я хочу разобрать текст непосредственно на примитивы (double, float, int).

Под прямым я подразумеваю:

  • без создания какого-либо временного вспомогательного объекта
  • без данных бокса в java.lang.Double, java.lang.Float...
  • без создания временных экземпляров java.lang.String (обязательный шаг, если вы хотите вызвать JDK Double.parseDouble(...))

До сих пор я использовал структуру javolution:

double javolution.text.TypeFormat.parseDouble(CharSequence sequence);

Я посмотрел код javolution, и он действительно не выделяет временных объектов. А поскольку он принимает CharSequence, вы можете представить символы, декодированные из файлов данных, без создания экземпляров временных строк.

Есть ли альтернативы или лучшие способы?


person Antoine CHAMBILLE    schedule 06.12.2012    source источник


Ответы (2)


Метод Double.parseDouble(String) действительно создает объект под капотом, но использует кэширование, возвращая двойное чтение из строки.
Этот ответ предлагает более подробную информацию.

Для остальных: пакет Javolution, похоже, написан для производительности в реальном времени, поэтому он кажется правильный пакет.

person MC Emperor    schedule 06.12.2012
comment
Я думаю, что для каждого вызова создается экземпляр sun.misc.FloatingDecimal. public static double parseDouble(String s) throws NumberFormatException { return FloatingDecimal.readJavaFormatString(s).doubleValue(); } - person Antoine CHAMBILLE; 06.12.2012
comment
Я думаю, что он создает промежуточный объект под капотом. docjar.com/html/api/sun/misc/FloatingDecimal. java.html - person Zutty; 06.12.2012
comment
Еще одна скрытая проблема заключается в том, что Double.parseDouble() работает только со строкой. Поэтому, когда вы анализируете символы файла, вам также необходимо создавать миллиарды временных экземпляров String только для их анализа. - person Antoine CHAMBILLE; 06.12.2012
comment
@AntoineCHAMBILLE: Да, но я предположил, что текст есть уже сохранен в строке или чем-то похожем на нее, потому что иначе я не вижу необходимости анализировать текст. - person MC Emperor; 06.12.2012
comment
Это означает, что вариант использования был недостаточно ясен. Я обновил свой вопрос. - person Antoine CHAMBILLE; 06.12.2012

StreamTokenizer, проверено здесь, возможно, стоит профилировать. Он анализирует десятичные числа как double, но не обрабатывает экспоненциальное представление.

person trashgod    schedule 06.12.2012
comment
Действительно, похоже, что StreamTokenizer может анализировать числа, не выделяя ни одного объекта. Но этот античный класс из java 1.0 выводит все числа как «двойные», вы не можете различать целые числа, числа с одинарной и двойной точностью. - person Antoine CHAMBILLE; 06.12.2012