Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка больших файлов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
KvitkaLavi
Отправлено: 14 Сентября, 2011 - 11:13:09
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Здравствуйте,
я пишу скрипт, который позволяет обрабатывать серверные логи и выполнять различные виды поиска и выборки по ним через sql.
Проблема в том, что один файл лога весит 100мб, а таких файлов может быть гораздо больше.
Задала set_time_limit(0), это позволило файлу пропарситься и записаться в БД, но выскочила ошибка при переименовывании. Когда тестировала на маленьких файликах, ошибки не было.
Собственно вопрос таков, как оптимизировать или может как-то разбить скрипт, чтобы он мог обрабатывать большие файлы?

*на пхп совсем недолго, поэтому могу невнятно формулировать вопросы, но с готовностью прислушаюсь, расскажу-покажу*
 
 Top
IronHawk
Отправлено: 14 Сентября, 2011 - 16:41:02
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Может косвенная проблема в параметре php.ini:
CODE (htmlphp):
скопировать код в буфер обмена
  1. [PHP]
  2. ......
  3. max_execution_time = 90
  4. ...
  5. memory_limit = 8M
  6. ......

Попробуйте поставить:
max_execution_time = 360
memory_limit = 256М
 
 Top
KvitkaLavi
Отправлено: 15 Сентября, 2011 - 14:47:04
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Если я повышаю эти параметры, надежность работы моего скрипта не падает?
 
 Top
Stierus Супермодератор
Отправлено: 15 Сентября, 2011 - 14:50:54
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Что бы помочь вам оптимизировать скрипт, этот скрипт нужно, как минимум, увидеть ...
 
My status
 Top
IronHawk
Отправлено: 15 Сентября, 2011 - 15:44:46
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




KvitkaLavi пишет:
Если я повышаю эти параметры, надежность работы моего скрипта не падает?

Не падает, это установка ограничений для самого PHP, а не для вашего скрипта, но эти параметры имеет смысл менять, если их значения меньше тех, что порекомендовал я.
 
 Top
KvitkaLavi
Отправлено: 16 Сентября, 2011 - 16:23:29
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Перефразирую тогда вопрос свой)))))

Можно ли как-то сделать так, чтобы скрипт прерывался, а потом дальше выполнялся? Но человек бы ничего не кликал для этого.. А то не хочется ставить всякие set_time_limit(0)...

Дело в том, что каждый лог весит по 100мб, а этих файлов может быть больше десятка точно.
Когда на своем компьютере тестировала, то один файл 10минут записывался и никак не поймешь - то ли оно подвисло, то ли пишет.
А если бы с прерываниями, то можно было бы выводить какие-то надписи, что всё хорошо, всё работает.
 
 Top
IronHawk
Отправлено: 16 Сентября, 2011 - 16:57:27
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




KvitkaLavi пишет:
Можно ли как-то сделать так, чтобы скрипт прерывался, а потом дальше выполнялся?

А зачем прерывать?
Пусть себе работает в паралельном "потоке" или "канале", правда это несколько сложно, но прочитать можно об этом тут или тут или даже тут. Подмигивание
 
 Top
KvitkaLavi
Отправлено: 21 Сентября, 2011 - 01:06:05
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Другой вопрос.
При обработке больших файлов возникает ошибка переименования: [function.rename]: Permission denied
Если файлы маленькие - всё отлично переименовывается, но как работать с большим файлом - ошибка.
 
 Top
caballero
Отправлено: 21 Сентября, 2011 - 02:08:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Можно ли как-то сделать так, чтобы скрипт прерывался, а потом дальше выполнялся?


Нельзя стандартными средствами

Прелдполагаю что вы парсите какмито громоздкими методами

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

вот и будет типа поэтапная обраьотка


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Stierus Супермодератор
Отправлено: 21 Сентября, 2011 - 11:36:56
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Повторю еще раз: что бы что-то оптимизировать, нужно видеть, что оптимизировать. С большими файлами нужно работать на лету, без хранения его больших частей в памяти и прочем.
Чем вариант с множеством стартов и прерываний выполнения скрипта лучше, чем постоянно работающий скрипт (если в этом скрипте не течет память)?
 
My status
 Top
DlTA
Отправлено: 21 Сентября, 2011 - 13:01:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Stierus пишет:
Чем вариант с множеством стартов и прерываний выполнения скрипта лучше, чем постоянно работающий скрипт

тем что на чужом хосте когда нет возможности редактировать лимит времени и объем памяти
как минимум не влезишь во временной лимит


KvitkaLavi, я делал слудующим образом
подгружал максимально возможный объем (чтоб влезть и в память и во время)
и делал редирект на страницу обработки указав гет запросом следующую точку отсчета

в итоге скрипт мог свободно выполняться любое (необходимое) время без посторонних кликов, все само в браузере перегружалось
 
 Top
Stierus Супермодератор
Отправлено: 21 Сентября, 2011 - 13:46:02
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




если все сделать правильно, объем памяти изменять не придется при любом времени исполнения кода. По поводу временных лимитов - такое обычно решается организацией очереди и запуском скриптов через крон. Алгоритм такой: запускается скрипт, который в бд кладет задачи (имена фалов для обработки и их текущий статус ready. Далее он отрубается. По крону запускаются раз в 30 секунд (или какое там время жизни у ваших скриптов) воркеры, которые смотрят в базу данных и выбирают файлы со статусом ready. После обработки скрипта файлу ставится статус finished. Остается подобрать время между стартами для крона и внедрить механизм блокировок.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Если скрипт не работает »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB