2013-09-18 2 views
0

У меня есть миллионы файлов в одном каталоге (в каталоге со многими дочерними каталогами), Эти файлы - все мелкие файлы.Каков наилучший способ прочитать и проанализировать миллионы файлов в WindowsNT

я думаю, что есть 2 проблемы:

  1. как прочесывают каталог, чтобы найти все файлы. Я попробовал метод FindFirstFile/FindNextFile, но я чувствую, что он слишком медленный. Должен ли я использовать журнал изменений Windows?

  2. после того, как я нашел все имена файлов, мне нужно прочитать весь файл в памяти, а затем проанализировать его. Должен ли я использовать флаг FILE_FLAG_SEQUENTIAL_SCAN? или существует более эффективный способ?

+0

Я думаю, что могу получить некоторые улучшения ** Улучшение ** от чтения целого файла в память. возможно, я был неправ. Мне нужно написать программу, чтобы доказать это. – sssa2000

+0

Как медленно идет медленно? Сколько времени занимает «FindFirstFile»? – Mehrdad

ответ

0

Некоторые идеи пнуть вокруг ..

  • Текста Гусеничного - Высокий незаменим Windows Search Tool - http://digitalvolcano.co.uk/textcrawler.html
  • Microsoft журнал парсер - http://technet.microsoft.com/en-us/scriptcenter/dd919274.aspx
  • Если у вас есть (или SQL MySQL) Сервер, на котором достаточно места, вы можете настроить SQL-задание для импорта/ссылки на файлы, о которых идет речь, тогда вы можете запросить их

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

+0

Я настраиваю Text Crawler, я использую apimon, чтобы увидеть api call.i нашел, что он использует FindFirstFile/FindNextFile. – sssa2000

0

NTFS, или на самом деле любая неспециализированная файловая система будет медленной с миллионами небольших файлов. Это территория баз данных.

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

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

+0

Насколько мне нравится Windows, я думаю, что Linux с ext3 или ext4 обрабатывает большое количество файлов намного лучше/быстрее, чем NTFS. – Mehrdad

+0

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

+0

Я не говорю, что он эффективен по сравнению с базой данных (или чем-то более подходящим для задачи), но вы говорите, что это не быстрее, чем NTFS? Я уверен, что это ... – Mehrdad

0

Вы можете использовать NtQueryDirectoryFile с большим буфером (скажем, 64 КБ) для запроса для детей.
Эта функция является абсолютным пределом для максимально быстрого взаимодействия с файловой системой.

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

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