| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Тексты > Потоковая обработка текста |
| Автор: Kolgarn 22.4.2012, 07:26 | ||||
| Собственно столкнулся с проблемой. Пишу небольшой скриптик под одно приложение. Вопрос в том, что актуальность в скрипте должна быть 50-60 мс. Файл целиком состоит из таких строк:
Причем наличие внутренних скобок, двоеточий не постоянно. Что вынудило меня использовать регулярки. Далее я написал что-то вроде:
Нет, оно не падает и прекрасно работает. Вопрос лишь в том, что я совсем не уверен в том, что это такая офигительная идея сидеть на хендале и вот так читать строки. Уже пару раз оно тупо строки пропускало в рамках тестирования под нагрузкой(пропихивал под парсинг большой поток строк). Собственно 2 вопроса: 1) Может есть какой-то оригинальный способ разобрать строку не регулярками или с ними но быстрее? При учете, что explode не катит ибо скобки бывают и круглыми и квадратными и треугольными(да и кол-во внутренних переменных не постоянно) -_- 2) Как лучше организовать потоковое чтение из файла? Повторяю актуальность нужна в пределах 50 мс, а лучше меньше. |
| Автор: Kolgarn 22.4.2012, 09:05 | ||||||
| Дополнение по прегам... Примерно такой хочу использовать что-бы отлавливать все скобки и етк.
Возникла сложность при анализе текста вроде:
Результат:
Это preg_match_all с PREG_SET_ORDER. Я вижу где ошибка, но понять не могу как исправить правильнее ее. Не подскажите? Так же если сможете то, что в {} получать без онных, то цены вообще вам не будет =) |
| Автор: Kolgarn 22.4.2012, 10:44 | ||||||
Такс... для обработки строк вида:
написал:
При работе с строкой(preg_match_all + PREG_SET_ORDER) выдает:
Что затрудняет анализ. В принципе попробую функцию "маску" написать, которая будет оценивать сопоставление. Не до конца уверен в правильности абсолютной, посему прошу оценить и подсказать если возможно лучше сделать. |
| Автор: Kolgarn 23.4.2012, 05:36 |
| Начинаю все больше убеждаться, что php вообще не подходит для подобного... ни одного вразумительного ответа на 4 форумах по этому поводу -_- Плюс заметил, что так или иначе теряются строки при моей реализации, что не есть хорошо. Может все-таки кто-то сталкивался с анализом текстового файла в потоковом режиме на php? |
| Автор: Kolgarn 23.4.2012, 06:22 | ||||||||
Мне ваш сарказм не понятен - абсолютно все было уже сказано в теме из вами перечисленного. По пунктам, пропуская первое высказывание: 1) Приложение абсолютно стороннее. Оно генерирует текстовый файл, который и нужно постоянно анализировать. 2) Смысл в том, что все время потраченное на получение, анализ и вывод результата от записи в нужный файл сторонней программой строки должно укладываться в 50-100 миллисекунд. Еще дополнительный момент к этому - в секунду в файл пишется порядка 5-10 строк в определенных ситуациях. Критичен порядок анализа. 3) Если бы пригляделись - я 3жды указывал пример строки для анализа. 4) В моем понимании "чтение не отходя от кассы". Т.е. постоянное отслеживание состояния файла и обработка ново поступивших строк. |
| Автор: ksnk 23.4.2012, 12:05 | ||
| Чем меньше регулярка тем быстрее работают с ней функции. Так что разумнее не делать preg_match all на всю строку, а порезать ( explode ) по закрывающим квадратным скобкам на блоки информации и анализировать их отдельно. Первую сразу преобразовывать во время. Регулярку, насколько хватило моих телепатических способностей, я бы переписал так
Хотя в телепатии не силен и что там на самом деле надо - не понимаю. С форматом нифига не ясно. Строка состоит из даты в квадратных скобках и информации в крадратных скобках. В каком виде хочется получить эту информацию? Функция чтения содержит классическую ошибку Если строки в файле появляются быстрее, чем $config['timeout'], то чтение будет идти все равно со скоростью не больше 1 строка в $config['timeout'] и `актуальность` пролетает. нужно читать в цикле из файла, пока не прочитает пустую строку и только после этого можно спать. |
| Автор: Kolgarn 23.4.2012, 15:07 | ||||
Да я так и делаю. С Ipad'a сижу вот и скинул код, что успел вспомнить) По explode у меня проблема в том, что переодически есть и другие типы скобок -_- Спасибо за совет по разрезанию. Признаться не думал, что отдельные преги будут быстрее. |