2010-05-08 3 views
5

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

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

Я могу сохранить дату последней проверки папки - легко ли получить все файлы с createddate> последней проверенной датой.

У кого-нибудь есть идеи?

Благодаря

Марк

+0

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

ответ

5

Ваш подход является единственным возможным (то есть, наблюдатель файловой системы позволяет видеть изменения, а не проверять при запуске).

Узнайте, что так долго. 20.000 проверок не должны занимать 10 минут - возможно 1 максимум. Ваша программа написана медленно. Как вы его протестируете?

Подсказка: не запрашивайте базу данных, получите список всех файлов в памяти, список всех файлов в базе данных, проверьте в памяти. 20.000 операторов SQL в базе данных слишком медленны, поэтому вам нужен ОДИН, чтобы получить список.

+0

Приветствия для подсказки tomtom, вы правы в моей программе, вызывая базу данных для каждого файла, конечно, одну область, в которой я могу реорганизовать. – foz1284

0

Вы можете написать сервис, который работает на этой машине? Затем служба может использовать FileSystemWtcher

+0

спасибо, я подумал об этом, но не хотел Идея иметь сервис, только личные предпочтения – foz1284

+0

Это все равно не гарантирует, что вы не пропустите никаких изменений. Кроме того, вообще говоря, наличие службы, работающей только для приложения, которое время от времени запускает плохую конструкцию. Конечно, в этом случае это может быть приемлемым; это зависит от типа приложения. – Thorarin

1

FileSystemWatchernotreliable, поэтому даже если вы можете воспользоваться услугой, это не обязательно сработает для вас.

Два варианта я могу увидеть:

  1. Держите список файлов, которые вы знаете о и держать в сравнении с этим списком. Это позволит вам увидеть, были ли файлы добавлены, удалены и т. Д. Храните этот список в памяти вместо запроса базы данных для каждого файла.
  2. Как вы предлагаете, сохраните временную метку и сравните ее.
+0

Метод отметки времени должен работать очень хорошо, но * только *, если вам также не нужно проверять удаленные файлы. Это не часть вопроса, но имеет смысл, что вам тоже будет интересно это знать. Возможно, вы можете делать проверку удаленных файлов реже, или в фоновом режиме, или что-то в этом роде. – Thorarin

2

10 минут кажется ужасно длинным для 20 000 файлов. Как вы собираетесь делать сравнение? Ваше предложение не учитывает удаленные файлы. Если вы хотите удалить их из базы данных, вам нужно будет выполнить полное сравнение.

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

+0

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

+0

@ foz1284: в этом случае использование временных меток является опцией. Они не технически на 100% надежны, потому что кто-то может изменить временную метку на файл. Однако это не проблема в вашем случае. – Mick

0

Наличие службы FileSystemWatcher, такой как Кевин Джонс, предполагает, вероятно, самый прагматичный ответ, но есть и другие варианты.

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

И если более правильно, но с меньшим шансом на то, что вы получите добро, если вы сидите, наблюдая за каталогом с 20K-файлами, вероятно, это время для развития вашей системной архитектуры. Не зная об этом гораздо больше о вашем приложении, похоже, что очередь сообщений может стоить посмотреть.

+0

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

1

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

Смежные вопросы