Я обрабатываю много гигабайт текстовых данных, и мне было интересно, есть ли способ улучшить производительность. Например, когда вы просматриваете 10 гигабайт данных и не обрабатываете их вообще, а просто повторяете строку за строкой, это занимает около 3 минут.

В основном у меня есть оболочка dataIterator, содержащая BufferedReader. Я постоянно вызываю этот итератор, который возвращает следующую строку.

Проблема в количестве создаваемых строк? Или, возможно, количество вызовов функций. Я действительно не знаю, как профилировать это приложение, потому что оно компилируется как jar и используется как служба STAF.

Любые идеи приветствуются?

4
esiegel 28 Май 2009 в 22:22

4 ответа

Лучший ответ

Начнем с основы: ваше приложение привязано к вводу-выводу . Вы не страдаете от плохой производительности из-за выделения объектов, ограничений памяти или ЦП. Ваше приложение работает медленно из-за доступа к диску.

Если вы думаете, что можете улучшить доступ к файлам, вам, возможно, придется прибегнуть к программированию более низкого уровня с использованием JNI. Доступ к файлам можно улучшить, если вы справитесь с этим более эффективно самостоятельно, а это нужно будет делать на более низком уровне.

Я не уверен, что использование java.nio даст вам лучшую производительность по величине, которую вы ищете, хотя это может дать вам больше свободы при выполнении операций с интенсивным использованием ЦП / памяти во время выполнения операций ввода-вывода.

Причина в том, что в основном java.nio обертывает чтение файла с помощью селектора, позволяя вам получать уведомление, когда буфер читается для использования, что действительно дает вам асинхронное поведение, которое может немного улучшить вашу производительность. Но чтение самого файла - ваше узкое место, а java.nio ничего вам не даст в этой области.

Так что сначала попробуйте, но я бы не стал слишком надеяться на это.

6
Yuval Adam 28 Май 2009 в 18:46

Если программа запускается через обычную командную строку «java -options ... ClassName args ...», вы можете профилировать ее. Я больше всего знаком с NetBeans Profiler. У него есть способ запускать Java-приложение отдельно (добавление java-параметра в автозагрузку ) затем прикрепите профилировщик.

Если вы пытаетесь оптимизировать, не оценивая, что нужно улучшить, вы работаете в темноте. Вам может повезти, или вы потратите много времени на ненужную работу.

0
Bill the Lizard 1 Авг 2012 в 16:11

Использование NIO, каналов, байтовых буферов и файлов с отображением памяти даст вам наилучшую производительность. Это настолько близко к аппаратному обеспечению, насколько вы собираетесь получить. У меня была аналогичная проблема, когда мне приходилось анализировать более 6 миллионов строк текста с разделителями (файл 265 МБ), затем перемещаться по столбцам с разделителями в строке и затем записывать его обратно. При использовании оборудования NIO и 2002 на это ушло 33 секунды. Уловка состоит в том, чтобы оставить данные в байтах. У вас есть один поток, считывающий данные для извлечения строки, другой поток для управления строкой и третий поток для обратной записи.

1
Javamann 28 Май 2009 в 22:34

Я думаю, что пакет Java NIO было бы чрезвычайно полезно для ваших нужд.

Эта статья в Википедии содержит отличную справочную информацию о конкретных улучшениях по сравнению с "старой" Java I. / O.

3
yalestar 28 Май 2009 в 18:33