Индексирование файлов и самый быстрый способ найти файл в папках? - PullRequest
3 голосов
/ 22 августа 2010

У меня 660000 XML-файлов (с уникальными именами файлов) в 22 папках.Каждая папка имеет 30000 файлов.Мне нужно найти их по их именам эффективно в приложении C #.Я знаю, что в Windows есть служба SearchIndexer (? Vista +?), И мне было просто интересно, могу ли я использовать ее или мне нужно индексировать файлы самому?имя файла является первичным ключом и путь в другом столбце.Однако следует ли мне создать одну таблицу с 660000 строками в ней или 22 таблицы с 30000 строками в каждой?И почему?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Мой опыт в этом может быть датирован (NTFS), но вы должны проверить, насколько быстро вы можете открыть файл в каталоге из 30 000 файлов. Я думаю, вы можете обнаружить, что лучше распределять файлы по большему количеству каталогов.

Если вы контролируете структуру каталогов, рассмотрите возможность хэширования имен файлов с номерами от 0 до 660000. Затем вы можете использовать файловую систему в качестве индекса:

00/
  00/
    <99 files that hash here>
..
65

Вам все еще нужно написать простой «индексатор», который читает каждый файл, вычисляет его хэш и сохраняет его в правильном месте. Затем вы ищите файл как:

Lookup(string filename)
{
   int hash = filename.GetHashCode() % 660000;
   string directory = HashToDirectory(hash);
   string path = Path.Combine(directory, filename);
   ...

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

Мы использовали аналогичный подход с веб-сканером, который хранил много файлов. Это было против NTFS, так что YMMV.

1 голос
/ 22 августа 2010

Программный запрос индекса :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...