LINUX.ORG.RU

сканирование директории


0

1

Ребята помогите добрым советом, пожалуйста... Задача следующая, нужно сканить директорию на файлы. Пробую scandir'oм - все отлично, пока файлов не окажется слишком много, и т.к. dir-320 немного слабоват, то начинает жутко висеть... можно-ли как-то скандиру ограничить максимальное число файлов, или есть какое-нибудь другое решение??????? Зарание огромное спасибо за помощь :)


readdir+opendir. Или написать на C, а из php запускать. Обход дерева ФС на C обычно на порядок быстрее, чем на php.

i-rinat ★★★★★
()

может ftw поможет?.. хотя задача не совсем ясна

metawishmaster ★★★★★
()

> нужно сканить директорию на файлы

ради чего это нужно делать?
а то костылей много можно всяких придумать

q11q11 ★★★★★
()
Ответ на: комментарий от q11q11

Вообще задача следующая, несколько процессов формируют файлы и кладут их в директорию, а задача данного процесса это при подключении к серверу сожрать все эти файлы и отправить по сети, а удачно отправленные удалить. Далее поймал проблему, когда инета долго нет, образуется около дофига файлов, при которых scandir просто вешает d-link. (демон написан на gcc)

cfox
() автор топика
Ответ на: комментарий от cfox

Как вариант, при добавлении нового файла делать запись о файле в некотором индексном файле.
Тогда:
1. Мы знаем сколько файлов(один файл - одна строка)
2. нам не надо сканить каталоги.

Или вы через «сетевое окружение» наполняете файлами ?

Jetty ★★★★★
()
Ответ на: комментарий от cfox

>Вообще задача следующая, несколько процессов формируют файлы и кладут их в директорию, а задача данного процесса это при подключении к серверу сожрать все эти файлы и отправить по сети, а удачно отправленные удалить.

inotify

madgnu ★★★★★
()
Ответ на: комментарий от cfox

> несколько процессов формируют файлы и кладут их в директорию

попробуй как Jetty говорит, только пусть каждый из этих процессов свой файл ведёт, ну или можно с sqlite побаловаться, а то играться с lock/read/write...


есть какое-нибудь другое решение?


можно через system() читать «ls -la»

q11q11 ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>boost::filesystem::recursive_directory_iterator

Как разжиревшие плюсы, а тем более бусты могут быть быстрее православного сишного скандира?

gogi
()
Ответ на: комментарий от q11q11

>можно через system() читать «ls -la»

ls сортирует список, если там мильёны файлов - будет виснуть. Луче тогда уж «find»

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Быстрее - никто не обещал, а сравнимо - запросто.

А смысл менять шило на мыло? У ТС'а тормоза, так их тут предлагают лечить ещё большими тормозами.

gogi
()
Ответ на: комментарий от gogi

Смысл в использовании буста - в надёжности и простоте использования (когда разберёшься). В бусте не может быть больших тормозов, чем в php, ты вообще херню сказал. Ну и напоследок укажу, что есть правило: операции с итераторами имеют сложность O(1). А не O(к-во файлов), как в пыхпыхе.

legolegs ★★★★★
()
Ответ на: комментарий от gogi

> Как разжиревшие плюсы, а тем более бусты могут быть быстрее православного сишного скандира?

хм...
а автор не указал какой scandir он использует, сишный или пхпшный?

q11q11 ★★★★★
()
Ответ на: комментарий от legolegs

>Смысл в использовании буста - в надёжности и простоте использования (когда разберёшься). В бусте не может быть больших тормозов, чем в php, ты вообще херню сказал.

Какой нафиг php? Я имею ввиду посиксный сишник. Ибо

(демон написан на gcc)


Так что херню сказал ты.
Но даже если взять буст. Давай посмотрим на машинку: mips проц на 240 МГц и 32 мб ОЗУ. Этим всё сказано: лучше с бустом здесь по своей воле не связываться.

gogi
()
Ответ на: комментарий от gogi

Ты буст с Qt не путаешь? Буст не жирный. Он долго компилируется, это да, но результирующий бинарник весьма худой.

Буст внутри работает на opendir и readdir, никакого жадного до памяти scandir (ни сишного, ни пхпшного). Ну и все проверки на ошибки. Поведение в случае, когда между вызовами readdir (т.е. вызовами boost::filesystem::recursive_directory_iterator::operator++) содержимое директории меняется - unspecified, т.е. новый файл можно увидеть, а можно и не увидеть.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>но результирующий бинарник весьма худой.

$ ls -l /usr/lib/libboost_filesystem.so.1.46.1
-rw-r--r-- 1 root root 140896 Апр 16 11:07 /usr/lib/libboost_filesystem.so.1.46.1

Debian testing. И это только filesystem. Средняя программа таким образом может легко килобайт 500 собрать. И это не говоря уже о том, что придётся используемый язык менять. Я кстати хорошо знаю сабжевую железку(у меня она есть). Ну так вот там 4 мб флеша: для ядра и rootfs. Ядро - примерно половина. Несложно догодаться, что из-за всяких бустов программа может не влезть во флеш. Для кого-то это может быть важно.
Нет я не против, используйте буст на «больших» компьютерах. Но здесь это не нужно.

Буст внутри работает на opendir и readdir

Что мешает реализовать это самостоятельно на голом сишнике?

gogi
()
Ответ на: комментарий от gogi

Чёрт, вы правы. Сошка очень жирная, гораздо жирнее своих собственных исходников. В потрохах там в основном исключения, всякая мелочь, которая вообще-то могла бы и заинлайниться и ворох функций от паттерна pimpl (который я очень не люблю).

Печально всё это. Когда буст работает в одном бинарнике всё гораздо приятнее обычно выглядит.

legolegs ★★★★★
()
Ответ на: комментарий от gogi

-rw-r--r-- 1 root root 140896 Апр 16 11:07 /usr/lib/libboost_filesystem.so.1.46.1

ото всё там,
статически собранная прога, с
boost::interprocess,thread,filesystem
248кб.

Что мешает реализовать это самостоятельно на голом сишнике?

больше велосипедов, хороших и разных

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от blackst0ne

Люди, спасибо Вам всем за помощь, сейчас тестию readdir|opendir, написано на с. Просто изначально хотелось сортировки, но да бог с ней... шеловое ls не катит, так как само виснет на очень долго, а вот как вариант readdir|opendir пофиг, они по файлам выкидывают... Еще раз ОГРОМНОЕ СПАСИБО ВСЕМ, кто откликнулся :)

cfox
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.