Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
SpectroShade
2 / 2 / 1
Регистрация: 02.05.2012
Сообщений: 51
#1

Обход файловой системы и мультипоточность

12.03.2015, 18:15. Просмотров 567. Ответов 13
Метки нет (Все метки)

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

Принцип работы - создаеться вектор, наполняем его структурами в которые записаны все данные об файлах вытянутые винАпи функциями.

Процес работает очень странно, первый запуск программы проходит Файловую систему примерно 2-3 минуты, следующий запуск вдвое меньше, и все последующие столько же примерно как и второй по вермени.

Появилась идея разбить процесс на потоки, по принципу каждый диск (D,C,E..) анализировать и индексировать в новом потоке, но записывать данные все в тот же единственный вектор. Все работает.

Вопрос - как еще можно ускорить работы индексации, возможно больше потоков, или есть еще какие нибудь фишки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2015, 18:15
Ответы с готовыми решениями:

Создание виртуальной файловой системы для explorer
В линуксовом (юниксовом) mc есть такое понятие "виртуальная файловая система"...

Шаблон файловой системы
В общем, задание такое: Разработать файловую систем, за жёсткий диск принять...

Как определить сериальный номер файловой системы?
Как определить сериальный номер файловой системы? В Delphi я знаю. Вот текст:...

Посоветуйте компоненты для работы с файловой системой
Посоветуйте компоненты для работы с файловой системой. Интересуют выбор...

Парсер файловой системы FAT32
Ребят, помогите кто чем может. Необходимо написать упрощенный парсер файловой...

13
Avazart
Эксперт С++
7703 / 5612 / 545
Регистрация: 10.12.2010
Сообщений: 25,208
Записей в блоге: 17
12.03.2015, 20:46 #2
Цитата Сообщение от SpectroShade Посмотреть сообщение
, но записывать данные все в тот же единственный вектор.
Лучше для каждого диска/потока сделать отдельный вектор, тогда не будет необходимости синхронизировать, а значит и не будет затрат на синхронный доступ.
1
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.03.2015, 18:01 #3
Цитата Сообщение от SpectroShade Посмотреть сообщение
Процес работает очень странно, первый запуск программы проходит Файловую систему примерно 2-3 минуты, следующий запуск вдвое меньше, и все последующие столько же примерно как и второй по вермени.
Это связано с тем, что оглавление файловой системы попадает в дисковый кэш операционной системы, откуда в следующие разы читается уже намного быстрее.

Цитата Сообщение от SpectroShade Посмотреть сообщение
Появилась идея разбить процесс на потоки, по принципу каждый диск (D,C,E..)
Это хорошо в том случае, когда нет разбиения на логические тома (одна буква - один винчестер). Если читать одновременно оглавления разных томов с одного устройства, можно и замедление получить.

Цитата Сообщение от Avazart Посмотреть сообщение
значит и не будет затрат на синхронный доступ
Что-то я сильно сомневаюсь, что затраты на синхронизацию в данном случае вообще заметны на фоне операций ввода-вывода.
0
SpectroShade
2 / 2 / 1
Регистрация: 02.05.2012
Сообщений: 51
13.03.2015, 18:33  [ТС] #4
Avazart, сейчас сделаю вашу попровку и сравним результаты.

Nick Alte, значит решения по ускорению этого процеса конкретно нет?
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.03.2015, 19:55 #5
Цитата Сообщение от SpectroShade Посмотреть сообщение
значит решения по ускорению этого процеса конкретно нет?
Думаю, здесь всё упирается в факторы, находящиеся вне компетенции программиста. Даже самым наилучшим и оптимальным образом написанная программа (например, Total Commander или FAR) будет упираться всё в те же временные рамки.
1
Avazart
Эксперт С++
7703 / 5612 / 545
Регистрация: 10.12.2010
Сообщений: 25,208
Записей в блоге: 17
13.03.2015, 20:50 #6
Цитата Сообщение от Nick Alte Посмотреть сообщение
Что-то я сильно сомневаюсь, что затраты на синхронизацию в данном случае вообще заметны на фоне операций ввода-вывода.
О каких операций ввода-вывода речь?
0
SpectroShade
2 / 2 / 1
Регистрация: 02.05.2012
Сообщений: 51
13.03.2015, 20:55  [ТС] #7
Цитата Сообщение от Nick Alte Посмотреть сообщение
Думаю, здесь всё упирается в факторы, находящиеся вне компетенции программиста. Даже самым наилучшим и оптимальным образом написанная программа (например, Total Commander или FAR) будет упираться всё в те же временные рамки.
В общей сложности, разделение на вектор-диск дал еще в среднем -8 секунд за индексакцию.
Индексация при первом запуске на 300 000 файлов: 120-150 сек , при последующих: 50-60 сек.

Остаеться распределение по типу файлов в отдельные отсеки (Музыка, Документы, Системные файлы), посомтрим сколько еще прибавиться. Спасибо
0
Avazart
Эксперт С++
7703 / 5612 / 545
Регистрация: 10.12.2010
Сообщений: 25,208
Записей в блоге: 17
13.03.2015, 21:04 #8
Да стоит попробовать учесть специфику поиска нужных данных/ распределенности данных по файловой системе, если таковая есть конечно. Возможно можно предусмотреть нечто вроде собственной индексации.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.03.2015, 22:29 #9
Цитата Сообщение от Avazart Посмотреть сообщение
О каких операций ввода-вывода речь?
Об операциях, связанных с получением информации о файлах. А почему такой вопрос вообще возник?
0
Avazart
Эксперт С++
7703 / 5612 / 545
Регистрация: 10.12.2010
Сообщений: 25,208
Записей в блоге: 17
13.03.2015, 23:04 #10
Nick Alte, Одно дело если вы имеете ввиду взаимодействие с файловой системой и совсем другое дело, если вы имеете ввиду вывод информации в GUI.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
14.03.2015, 20:01 #11
Avazart, загадочен и непонятен ход вашей мысли. С какой стати я бы имел в виду GUI, если ТС говорит о долгом обходе файловой системы?
0
Avazart
Эксперт С++
7703 / 5612 / 545
Регистрация: 10.12.2010
Сообщений: 25,208
Записей в блоге: 17
14.03.2015, 20:03 #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Avazart, загадочен и непонятен ход вашей мысли
а при чем тут:
Цитата Сообщение от Nick Alte Посмотреть сообщение
операций ввода-вывода.
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2015, 20:14 #13
Файловые операции - это тоже ввод-вывод.
0
SpectroShade
2 / 2 / 1
Регистрация: 02.05.2012
Сообщений: 51
14.03.2015, 22:41  [ТС] #14
Добился обхода 300 000 файлов за 25+ секунд. Учитываеться время добавления в мульти-вектор всех данных о файле.
0
14.03.2015, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 22:41

Управление уровнем доступа к объектам файловой системы
Доброго времени суток! Подскажите пожалуйста как можно осуществить такую...

Мультипоточность С++
Была написана программа, а после этого пришли к выводу, что явным образом...

Работа с файловой системой
Скажите пожалуйста какие в MFC есть классы для работы с файловой системой(для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru