![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Бьюсь сейчас над решением задачи быстрого копирования большого количества файлов. Ситуация такова, что при использовании функции CopyFileEx на файлах в количестве 30 000 программе необходимо около 6 мин, в то время, как копирование этих же файлов с помощью проводника отнимает чуть больше полторы минуты.
Подозреваю, что всё дело в том, что ОС это делает в несколько потоков, потому вижу 2 варианта решения проблемы: 1. Самому делать в это в несколько потоков (не факт, что сработает, так как возможно, что все запросы на копирование файлов с помощью функции CopyFileEx становятся в очередь) 2. Найти функцию, которая отправляет на копирование не один файл, а группу файлов, чтобы ОС сама могла распределять свои ресурсы для самого оптимального копирования Более предпочтительным есть второй вариант, но не уверен, что в WinAPI найдется подобная функция. Если кто-то знает о её существовании или имеет еще какие-то варианты решения проблемы - буду очень признателен. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
||||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
К сожалению скорость от использования этой функции не выросла: во-первых очень медленно проходит подготовка файлов (секунд 30-40), по всей видимости в это время парсится входящая строка, а во вторых скорость копирования такая же как при использовании CopyFileEx (в окне копирования пишет 1,26 МБ/сек, при том, что во время копирования через проводник скорость 5 МБ/сек). Может кто-то знает другие способы быстрого копирования файлов? |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Как происходит тестирование? Сперва - своя программа, потом - проводник? Для чистоты эксперимента не помешает перезагрузка компьютера между замерами. В противном случае винда может закешировать файлы, и в результате второй "забег" окажется гораздо быстрее. |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
||||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Попробовал наоборот, ничего не поменялось, проводник копирует минимум в 5 раз быстрее
|
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
XperT, покажи код.
|
|||
|
||||
| XperT |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Класс делал с заделом на будущее:
Проверял на таком коде:
|
||||
|
|||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Смущает меня то, что сравнивается не время копирования а "значение скорости копирования" выдаваемое окном визуализации процесса копирования.
И ещё одно смущает. В методе TFileProccessing.CopyFiles структура SHFileOpStruct - локальная переменная, но никакого предварительного обнуления сей структуры не производится. Следовательно некоторые поля этой структуры явно задаются в коде метода, а прочие остаются на усмотрение Александра Сергеевича. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Проводник копирует за 1-1,5 мин, программа за 6-7 мин. Точных вычислений не делал, и так прекрасно видно, что разница в скорости очень большая. В посте приводил данные по скорости копирования из окна копирования потому, что соотношения соотвествуют временным.
Какие прочие? Все свойства структуры заполнены, проверял через дебагер. |
||||
|
|||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
После перезагрузки провел еще один эксперимент: сначала копировал проводником, потом через программу.
Проводник: Процесс копирования запустился сразу, без задержек на оценку. Продолжительность копирования: 2 мин 50 сек Программа: 1. Сначала запустилась оценка: ![]() Это продолжалось 48 сек. 2. Потом запустилось само копирование. Продолжительность ~ 2 мин 3. Под конец копирования окошко подвисло в таком состоянии: ![]() Длилось это 3 мин 39 сек Итого: 6 мин 27 сек против 2 мин 50 сек |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Чем они заполнены, если вы сами их не заполняли? Мусором? -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
||||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Да. Был не прав, признаю. Значит надо попробовать разобраться из-за чего происходит это подвисание. Ибо весь остальной процесс выполняется за такое же время как и процесс копирования в проводнике. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Не совсем весь, первый пункт так же не наблюдается в проводнике. Вроде и мигает в нём что-то вроде оценки, но буквально на пол секунды, а тут почти минута. Я предполагаю, что идёт парсинг передаваемой строки, вопрос только почему так медленно. Да и в ряд ли тут что-то поделаешь, не так много в этой функции свойств и флагов, чтобы можно было экспериментировать и искать оптимальные варианты, а больше по сути ничего и не сделаешь. В любом случае проблему решил другим путем: копирование файлов через CopyFileEx в несколько потоков. Опытным путем было вычислено, что при разбиении списка файлов на 3 равных части и копирования каждой в отдельном потоке даёт самую оптимальную скорость. На тех же файлах скорости копирования находится в диапазоне 120-150 сек. Увеличивание количества потоков даёт очень маленький прирост (скорее всего всё дело упирается в скорость работы винта, что собственно и требовалось сделать). Тему можно считать закрытой. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Для вас да. А вот меня она заинтересовала. Ибо скорость копирования - это скорость копирования не более того. Тем более, что скорость копирования зависит ещё и от конфигурации компьютерного железа. А вот время выполнения копирования функцией SHFileOperation мне гораздо более интересно. Как, когда и от чего это время зависит? -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Ну если разберетесь - буду рад услышать решение. К сожалению у меня проект стоял пока я этим копированием занимался и пришлось удовлетворятся тем, что имел (тем более, что производительность та же, да и с отловом ошибок при копировании большого количества файлов проще). Это сообщение отредактировал(а) XperT - 3.5.2012, 00:35 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Ну тогда помогите мне задать начальные условия для проверки. Как вы формировали список из 30000 файлов для копирования? 1. В случае копирования через проводник 2. В случае копирования через вашу программу -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Есть папка с файлами (пробовал по разному: и с подпапками, и все картинки в одной папке - разницу не заметил). В папке находятся аватарки в большом количестве (по сути большое количество маленьких файлов)
1. В проводнике: выделяю папку -> Ctrl+C -> открываю другую папку (на другом диске) -> Ctrl+V 2. В программе: парсится папка с файлами -> формируется список файлов -> отправляется в функцию копирования файлов Замер скорости копирования во втором случае начинается с момента появления окошка копирования (т.е. исключается время парсинга списка файлов). |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Ну ты в одном случае копируешь папку, а в другом список файлов. Что если попробовать делать копии одного и того же, например папку в обоих случаях?
|
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Дело в том, что в некоторых случаях программа должна копировать не все файлы, а в некоторых даже не все файлы в одну папку, потому интересовал универальный способ быстрого копирования
|
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Вот почему я и спросил "Как вы формировали список из 30000 файлов для копирования?". Продолжаю настаивать на том, что нужно разобраться в причинах того самого зависания. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Все-таки сравнивать нужно одни и те же вещи - проводник копирует папку, и в программе копируем папку. Также и с файлами - если формируем список сами, также сделать и в проводнике если получится. Уверен, что результаты будут при прочих равных условях одинаковыми. |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Проводник:
1. Зашел в папку с картинками, выделил все файлы, копировал - произошла задержка на 5 сек 2. Открыл папку назначения, Ctrl + V, произошла задержка в 3 сек для оценки и сразу запустилось копирование 3. Процесс копирования длился 3 мин 15 сек 4. Под конец копирования никаких зависаний не было, окно сразу же закрылось Итого: немного медленее чем при копировании папки, но всё равно на много быстрее чем через SHFileOperation |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Мне прям интересно стало, надо вечером вбить, попробовать
|
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 1 Всего: 4 |
Есть подозрение, что в Вин7 проводник использует другую WinAPI функцию для копирования (которая появилась только в висте или 7).
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |