Java I / O потребляет больше ресурсов процессора - PullRequest
0 голосов
/ 27 августа 2009

Я пытаюсь создать 100 файлов, используя FileOutputStream / BufferedOutputStream. Я вижу, что загрузка процессора составляет 100% в течение 5-10 секунд. Справочник, который я пишу, пуст. Я создаю файлы PDF через iText. Каждый файл имеет раунд 1 МБ. Я работаю в Linux.

Как я могу переписать код, чтобы я мог минимизировать использование процессора?

Ответы [ 5 ]

8 голосов
/ 27 августа 2009

Не угадайте: профилируйте вашу заявку.

Если числа показывают, что во время / в вызовах на запись тратится много времени, найдите способы ускорить ввод-вывод. Но если большая часть времени тратится на форматирование материала для вывода (например, рендеринг iText), то именно на этом вам и нужно сосредоточить свои усилия.

4 голосов
/ 27 августа 2009

Это в каталоге, который уже содержит много файлов? Если это так, то вы можете просто увидеть штраф за наличие большого количества файлов в каталоге - это сильно зависит от операционной системы и файловой системы.

В противном случае, что вы на самом деле делаете во время создания файлов? Откуда поступают данные? Это большие файлы? Одна вещь, которую вы, возможно, захотите сделать, - это попытаться записать в ByteArrayOutputStream вместо этого - таким образом, вы сможете увидеть, какая часть активности связана с файловой системой и насколько просто вы получаете / записываете данные.

2 голосов
/ 27 августа 2009

Это длинная догадка, но даже если вы используете буферизованные потоки, убедитесь, что вы не записываете ни одного байта за раз.

Методы .read(int) и .write(int) являются убийцами процессоров. Вы должны наверняка использовать .read(byte[]...) и .write(byte[], int, int).

0 голосов
/ 27 августа 2009

Файл размером 1 МБ для записи достаточно велик, чтобы использовать java.nio FileChannel и видеть значительные улучшения производительности по сравнению с java.io. Перепишите свой код и оцените его по старому стилю. Я прогнозирую улучшение в 2 раза, как минимум.

0 голосов
/ 27 августа 2009

Вы вряд ли сможете снизить нагрузку на процессор для своей задачи, особенно в системе Windows. Java в Linux поддерживает асинхронный файловый ввод / вывод, однако это может серьезно усложнить ваш код. Я подозреваю, что вы работаете в Windows, поскольку файловый ввод-вывод обычно занимает гораздо больше времени в Windows, чем в Linux. Я даже слышал об улучшениях при запуске Java на виртуальной машине Linux под Windows.

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

  • Обновление -

JSR 203 специально обращается к необходимости асинхронного, мультиплексированного ввода-вывода файла разброса / сбора:

Мультиплексное неблокирующее средство, представленное JSR-51, решило большую часть этой проблемы для сетевых сокетов, но не для операций с файловой системой.

Пока JSR-203 не станет частью Java, вы можете получить настоящий асинхронный ввод-вывод с помощью Apache MINA проекта для Linux.

Java NIO (1) позволяет выполнять ввод-вывод на основе каналов. Это улучшение производительности, но вы выполняете только буфер данных за раз, а не истинный асинхронный и мультиплексированный ввод-вывод.

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