Ограничение скорости File.Copy

Мы используем простой файл File.Copy в С# для перемещения резервных копий базы данных в дополнительные места.

Однако на некоторых серверах это приводит к тому, что сервер SQL практически перестает работать. Эти серверы имеют очень ограниченную память, поэтому они часто выгружают данные на жесткий диск.

В то время как мы должны покупать больше памяти, это не произойдет долгое время: -/

Итак, мне интересно, могу ли я как-то ограничить скорость операции File.Copy? (Тем самым предоставив серверу SQL доступ к жесткому диску)

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

Ответ 1

CopyFileEx может делать то, что вам нужно - он имеет функцию обратного вызова, которую вы можете использовать как искусственный slowing method (не попробовал это для этого сценария, хотя поэтому я не уверен в реальных эффектах - стоит попробовать ИМХО).

Ответ 2

Пробовали ли вы придать вашему процессу копирования приоритет ниже обычного? Вы можете сделать это через диспетчер задач или с помощью команды start:

> start myCopyApp.exe /BELOWNORMAL

Ответ 3

Один из них недоступен через File.Copy. У вас есть ряд других вариантов. Вы можете, как вы говорите, передавать байты вручную, иногда спать. Вы можете использовать реализацию BITS, хотя это немного OTT.

Кроме того, если проблема в памяти - сжимайте файл или класть его на более мелкие файлы, которые нужно перестроить позже.

Ответ 4

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

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