Проблемы с производительностью при использовании Copyfile () для копирования файлов с разных компьютеров - PullRequest
1 голос
/ 17 февраля 2009

Использование VC ++ VisualStudio 2003.

Я пытаюсь скопировать несколько файлов изображений (примерно 30 КБ на файл) из общей папки другого компьютера в локальный файл.

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

Есть ли альтернативный метод копирования файлов с другого компьютера, который мог бы ускорить копирование?

Заранее спасибо.

EDIT * Из-за запроса клиента невозможно изменить базу кода, ненавижу приходиться отклоняться от передового опыта из-за нетехнических проблем, но есть ли более тонкий подход? например, вызов другой функции?

Я знаю, что спрашиваю о магическом вуду, спрашиваю на всякий случай, если кто-то знает о таком.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2009

Несколько вещей, чтобы попробовать:

  • копирование файлов с использованием ОС происходит быстрее?

  • если нет, то могут быть некоторые ограничения, присущие вашей сети или способам ее настройки (возможно, проблемы с аутентификацией, или у удаленного сервера есть некоторые аппаратные проблемы, или он слишком занят, или сетевая карта теряет слишком много пакеты из-за коллизий, неисправного коммутатора, плохой проводки ...)

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

  • если большие файлы работают быстро, то с вашей сетью все в порядке, и вы, вероятно, не сможете значительно улучшить систему (узкое место в другом месте).

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

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

Несколько ссылок, которые вы можете проверить для многопоточной копии файла:

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

1 голос
/ 17 февраля 2009

Ну, для начала, 2000 - это , а не несколько. Если это занимает большую часть времени из-за того, что вы отправляете много маленьких файлов, то вы придумали решение, которое упаковывает их в источнике в один файл и распаковывает их в месте назначения. Для этого потребуется некоторый код, работающий в исходном коде - вам нужно будет спроектировать свое решение, чтобы разрешить это, поскольку, как я полагаю, в данный момент вы просто копируете из общего сетевого ресурса.

Если это скорость сети (маловероятно), вы также сжимаете их.

Мое собственное убеждение состоит в том, что это будет количество файлов, в основном все повторяющиеся затраты на запуск копии. Это связано с тем, что 2000 файлов размером 30 КБ занимают всего 60 МБ, а для ссылки 10 МБ теоретическое минимальное время составляет около минуты.

Если ваши времена значительно выше этого, я бы сказал, что я прав.

Решение, использующее 7zip или подобное для сжатия их всех в один 7z файл, передачи их, а затем разархивирования на другом конце звучит так, как вы ищете.

Но измерить, не угадай! Проверьте это, чтобы видеть, улучшает ли это производительность. Тогда прими решение.

...