parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Misha v.3 20.06.2005 17:26 / 20.06.2005 17:38

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

как показывает мой опыт, лучший способ загрузки большого объема данный в БД - подготовка текстового файла в специальном формате и загрузка его в таблицу средствами SQL (см. load data infile в документации по MySQL). сама загрузка происходит _на_полтора_порядка_ быстрее чем пачка insert (даже групповых).

есть ещё что можно пооптимизировать в вашем цикле, но см. выше, это дорога в тупик.
действительно можно 17000 значений через запятую перечислить в sql-запросе
у MySQL кажется можно (сверьтесь с его документацией). у меня на нескольких тысячах это нормально работает. десятки тысяч я не проверял. у оракла ограничение 1000.
и это будет работать лучше чем через меню?
я уверен, что да (почитайте про DELETE в документации по mysql)
А если 50 000, 100 000 ?
думаю и в этом случае не надо делать удаление по одной записи в menu. в подобном случае надо подготовить данные, и удалять например в одном запросе по 1000 записей. sql запросов будет меньше. работать это будет быстрее.
2. ^memory.compact[] очищает память от неиспользуемых переменных. Тогда почему нужно его ставить внутри цикла ^t.menu{}, если там все переменные используются, и освобождать память не от чего ?
там есть неявные переменные. т.е. подготовился текст sql запроса, выполнился запрос. этот текст больше не нужен. но память он занимает. есть переводы строк в вашем menu. это 17тыс на 2 байта (возможно больше) + сколько - то байтов на язык (taint). парсер тоже это запоминает, и compact-ом это не лечится.
^if($ff.[s^tc.line[]] ne none){...}
можно убрать, если вначале сделать $tc[^tc.select($ff.[s^tc.line[]] ne none)] и не придется в каждой из 17000 строк делать эти проверки (т.е. минус 17000 * количество строк в $tc проверок)