Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсер log файла, 100% загрузка процессора 
V
    Опции темы
Krivoy
Дата 11.2.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.2.2008
Где: г. Киров

Репутация: нет
Всего: нет



Уважаемые гуру JAVA!
Решив освоить JAVA попытался написать программу-парсер лога для своих админских нужд - структура проги проста до безобразия - в цикле читается лог файл, елочкой IFов выбирается нужные данные (если есть)regexpaми и заносятся в MySQL. Было вроде всё просто - пока не дошел до запуска программы в бесконечном цикле - вот кусок программы 
Код


try {

    in = new BufferedReader(new InputStreamReader(new FileInputStream("logfile")));
    boolean stopflag = true;
    while (stopflag) {
while (in.ready()) {
String s = in.readLine().toLowerCase();
и т.д.

И вроде бы всё хорошо - при появлении новых строк в файле они обрабатываются, но я заметил в top что программа есть 100% процвремени :(
  Или top показывает не правду (т.к. комп вроде даже и не тормозит (хотя 100 только на одном из ядер)), или есть какие то другие способы парсить новые строчки в файле, или в цикле добавить какой-нибудь wait(хотя тред у меня один), или все-таки запоминать последнюю прочитанную строку и через какое то время пытаться читать следующюю(тут программа заметно усложниться :( что не хотелось бы)???
Помогите кто чем может а? 

P.S. Сделайте скидку на начинающего - изучаю JAVA четвертую неделю только smile
PM MAIL   Вверх
LSD
Дата 11.2.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Попробуй так:
Код

String s;
while((s = in.readLine()) != null)
{
....
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Krivoy
Дата 11.2.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.2.2008
Где: г. Киров

Репутация: нет
Всего: нет



Цитата(LSD @ 11.2.2008,  13:28)
Попробуй так:
Код

String s;
while((s = in.readLine()) != null)
{
....
}

Эээммм.... Может я что то не так обьяснил, но программа должна работать постоянно и при появлении новых строк в лог файле(они дописываются серваком в конец файла) проверять их и если что найдет заночить в базу, а сделав как рекомендовали она просто прошла файл и завершила работу :(

Можно ли ещё вариант а?
PM MAIL   Вверх
LSD
Дата 11.2.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну тогда просто добавь внутрь цикла проверку, если прочитанная строка пустая или null, то:
Код

Thread.sleep(50);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Krivoy
Дата 11.2.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.2.2008
Где: г. Киров

Репутация: нет
Всего: нет



Цитата(LSD @ 11.2.2008,  15:32)
Ну тогда просто добавь внутрь цикла проверку, если прочитанная строка пустая или null, то:
Код

Thread.sleep(50);

smile))
Спасибо за совет!
Просто я не обновил страницу - сам решил со sleepом попробовать - но поставил там от души - 1000 !
А что 50 хватит? А почему так разительно снизилась загрузка проца(буквально до 2%)? 
PM MAIL   Вверх
LSD
Дата 11.2.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Krivoy
Дата 11.2.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.2.2008
Где: г. Киров

Репутация: нет
Всего: нет



Цитата(LSD @ 11.2.2008,  16:06)
Там даже 1 хватило бы чтобы прилично снизить нагрузку, просто до этого твоя задача молотила пустой цикл не отдавая такты, а так она будет их отдавать. Большее значение конечно лучше (но до определённого предела, потом улучшения уже не будет), вопрос только в том, как часто надо проверять не добавились ли данные в лог.

Упс - не написал - это лог почтового сервера - записи там добавляются ну штук 10 строк на одно письмо - загрузка моего сервера не большая - от силы по 2-3 сообщения в секунду в пике - 50 хватит?. Вот в связи с этим меня терзают смутные сомнения из-за не знания работы связки
Код

in = new BufferedReader(new InputStreamReader(new FileInputStream("/logfile")));
String s = in.readLine().toLowerCase();

Оно вроде как и Stream, но в свою очередь и Buffered и вот если гипотетически предположить ситуацию когда строки были добавлены, а тред находился в sleep что произойдёт? - не пропустит ли он эти строки? как добавляются они из stream в  buffered? Или когда обьект in создан система сама заботится о добавлении новых данных в буфер из потока? и при поступлении новой порции он(in) становится ready?
 
  Извините за такое количество вопросов, просто схема работы readLine больше походит на типа что то getLine (т.е. readLine а потом deleteLine) и в моем понимании строка в буфере должна остаться - просто увеличится счётчик читаемой строки, а она там по ходу удаляется из буфера, или я не прав?(поправьте пожалуйста).
PM MAIL   Вверх
LSD
Дата 11.2.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Krivoy @  11.2.2008,  16:40 Найти цитируемый пост)
Упс - не написал - это лог почтового сервера - записи там добавляются ну штук 10 строк на одно письмо - загрузка моего сервера не большая - от силы по 2-3 сообщения в секунду в пике - 50 хватит?

Если ты будешь засыпать только когда новых сообщений нет (т.е. s - null), то можно даже увеличить до 250. Думаю 4 раза в секунду проверять не поступили ли новые сообщения вполне нормально.


Цитата(Krivoy @  11.2.2008,  16:40 Найти цитируемый пост)
Оно вроде как и Stream, но в свою очередь и Buffered и вот если гипотетически предположить ситуацию когда строки были добавлены, а тред находился в sleep что произойдёт? - не пропустит ли он эти строки? как добавляются они из stream в  buffered? Или когда обьект in создан система сама заботится о добавлении новых данных в буфер из потока? и при поступлении новой порции он(in) становится ready?

Буферизация делается средствами самой Java. Т.е. когда ты читаешь данные из потока, независимо от того сколько ты хочешь/готов прочесть, один байт или 100, BufferedReader читает некое заранее оговоренное число символов (по умолчанию 8к). Далее все чтение будет происходить из этого кеша, пока он не опустошиться. Никто в него символы не пихает. Он просто позволяет сократить число обращений к нижележащему потоку, если чтение происходит малыми порциями. Если читать из него большими кусками (несколько К), то смысла в нем нет.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Krivoy
Дата 12.2.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.2.2008
Где: г. Киров

Репутация: нет
Всего: нет



Спасибо - всё стало ясно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0769 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.