![]() |
|
Модераторы: 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 сек. Увеличивание количества потоков даёт очень маленький прирост (скорее всего всё дело упирается в скорость работы винта, что собственно и требовалось сделать). Тему можно считать закрытой. |
|||
|
||||
![]()
|
| Правила форума "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. |