Ограничение скорости 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: в противном случае независимо от того, насколько небольшой ваш буфер приложения, файловая система будет буферизироваться (и, следовательно, вызывает дополнительную замену).