Пишу на Perl’е поисковик по FTP-серверам. Использую Net::FTP.
Проблема следующая: при индексации нужно помимо названий файлов/каталогов узнавать их размер. Два найденных мною способа решения этой задачи таковы: делать `ls -lA` или ls + смотреть $ftp->size($filename); для каждого элемента. Второй по понятным причинам очень не оптимален, но первым сложен тем, что при `ls -lA` на каталог, в котором, скажем, 3.000 файлов, начинается жуткий резкий скачок выделяемых на мой indexer ресурсов удаленного компьютера, требуемых для вывода такого количества информации. Кое-как такую ситуацию пытаюсь тушить sleep(); с количеством секунд в зависимости от количества про-ls-енных элементов. Это позволяет избежать дальнейшей нагрузки из-за большого наплыва запросов ls, но не решает проблему периодических скачков (при ls на объемные каталоги).
Есть ли идеи, как таких скачков избежать?
Т.е., например, как-то (как?!) делать ls на первые X элементов каталога, затем (после sleep();) листить с X-ного по 2X-ный и т.п. Была идея с узнаванием примерного кол-во элементов каталога из этого самого `ls -lA`, но на Win-платфрмах для каталогов размер всюду ставится равным нулю.
У меня сейчас стоит примерно так:
if ($elements>1024){ sleep(5); } elsif ($elements>512){ sleep(3); } elsif ($elements>64){ sleep(2); } elsif ($elements>4) { sleep(1); }
Очень долго подбирал значения: эти позволяют индексировать все практически совершенно безболезненно.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Сперва пробовать прочитать файлик ls-lR.gz, если он есть (например, как на ftp://ftp.chg.ru/ и множестве других)
Скачивать его и разбирать.
Для тех же ftp-серверов, что это не поддерживают, через некоторое время, после двух-трёх раз дикой нагрузки простого сканирования — либо закроют доступ, либо выложат такой же файлик. Можно, предварительно письмом попросить создавать такой файлик.
Таких файликов нет, и создавать их никто не будет.
Поиск рассчитан на локальные ftp, где 99.8% (остаток — это я) серверов под Windows.
Доступ закрывать тоже не будут. Эта нагрузка фактически не заметна. Поэтому я пока решил оставить все, как есть. Жалоб не поступало.
над локальными серверами я, в своё время, издевался….
после коннекта спрашивал `ls -aFlR`.
Сервер думал-думал, после чего отдавал мегабайтный лог. разом
в своей локлаке я сделал по второму способу через базу mysql, т.е. я запускаю скрипт он соед с сервером, делаем $ftp->ls сохраняем результат в бд, потом при помощи foreach узнаём размер, дальше снова листим ($ftp->($file)) снова узнаём размер… вроде правильно объяснил… давно это было, теперь в локалке люди пользуются поиском по муз серверу через веб фэйс
2 Shurup
сорри, если не совсем в тему…
пишу ftp-поисковик на перле (бакалаврат)
если есть по етому делу инфа, подкиньте плз на мыло….