Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
SpectroShade
2 / 2 / 1
Регистрация: 02.05.2012
Сообщений: 51
#1

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

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

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

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

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

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

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

Создание виртуальной файловой системы для explorer - C++
В линуксовом (юниксовом) mc есть такое понятие "виртуальная файловая система" (ВФС). Когда в программе отображается файл, к примеру архив...

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

Как определить сериальный номер файловой системы? - C++ Builder
Как определить сериальный номер файловой системы? В Delphi я знаю. Вот текст: Procedure TForm1.Button1Click(Sender: TObject); Var...

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

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

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

13
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,375
Записей в блоге: 17
12.03.2015, 20:46 #2
Цитата Сообщение от SpectroShade Посмотреть сообщение
, но записывать данные все в тот же единственный вектор.
Лучше для каждого диска/потока сделать отдельный вектор, тогда не будет необходимости синхронизировать, а значит и не будет затрат на синхронный доступ.
1
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 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
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.03.2015, 19:55 #5
Цитата Сообщение от SpectroShade Посмотреть сообщение
значит решения по ускорению этого процеса конкретно нет?
Думаю, здесь всё упирается в факторы, находящиеся вне компетенции программиста. Даже самым наилучшим и оптимальным образом написанная программа (например, Total Commander или FAR) будет упираться всё в те же временные рамки.
1
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,375
Записей в блоге: 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
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,375
Записей в блоге: 17
13.03.2015, 21:04 #8
Да стоит попробовать учесть специфику поиска нужных данных/ распределенности данных по файловой системе, если таковая есть конечно. Возможно можно предусмотреть нечто вроде собственной индексации.
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.03.2015, 22:29 #9
Цитата Сообщение от Avazart Посмотреть сообщение
О каких операций ввода-вывода речь?
Об операциях, связанных с получением информации о файлах. А почему такой вопрос вообще возник?
0
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,375
Записей в блоге: 17
13.03.2015, 23:04 #10
Nick Alte, Одно дело если вы имеете ввиду взаимодействие с файловой системой и совсем другое дело, если вы имеете ввиду вывод информации в GUI.
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
14.03.2015, 20:01 #11
Avazart, загадочен и непонятен ход вашей мысли. С какой стати я бы имел в виду GUI, если ТС говорит о долгом обходе файловой системы?
0
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,375
Записей в блоге: 17
14.03.2015, 20:03 #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Avazart, загадочен и непонятен ход вашей мысли
а при чем тут:
Цитата Сообщение от Nick Alte Посмотреть сообщение
операций ввода-вывода.
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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
Привет! Вот еще темы с ответами:

Работа с файловой системой - Visual C++
Скажите пожалуйста какие в MFC есть классы для работы с файловой системой(для создания и удаления каталогов , поиска файлов, узнавания...

Мониторинг файловой активности приложения - Visual C++
Доброго времени суток. Возможно ли с узнать, к каким файлам обращается конкретный процесс? В Линуксе есть похожая библиотека -...

Рекурсивный обход файловой системы - Java SE
Я ужо замучалась. Мне надо распечатать все файлы и папки с локального диска С. Понимаю, что задача двести лет как решена, но я не понимаю...

Обход всех каталогов файловой системы - C++
какой цикл надо организовать чтобы программа прошлась по всем каталогам файловой системы?


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

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

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