Мы используем простой Файл. Копия в C# для перемещения нашей базы данных копирует к дополнительным местоположениям.
Однако на некоторых серверах, это заставляет SQL-сервер в значительной степени прекращать работать. Эти серверы имеют очень ограниченную память, таким образом, они - данные подкачки страниц к жесткому диску время от времени.
Пока мы должны купить больше памяти, это не собирается происходить в течение долгого времени :-/
Таким образом, я задаюсь вопросом, могу ли я так или иначе ограничить скорость Файла. Операция копии? (Таким образом, предоставление SQL-сервера некоторой комнаты для доступа к жесткому диску)
Я мог использовать "старый школьный" подход с двумя потоками, читая и пишущий через буфер, и просто спать приблизительно 5 мс между чтениями. Но я действительно предпочел бы более опрятное решение, если такой доступен.
CopyFileEx может делать то, что вам нужно - у него есть функция обратного вызова, которую вы можете использовать в качестве искусственного метода замедления
(хотя я не пробовал это для этого сценария, поэтому я не уверен в реальных эффектах - стоит попробовать ИМХО).
Вы пытались дать процессу копирования приоритет ниже обычного? Вы можете сделать это через диспетчер задач или с помощью команды start
:
> start myCopyApp.exe /BELOWNORMAL
Один недоступен через File.Copy. У вас есть несколько других вариантов. Вы можете, как вы говорите, передавать байты вручную, иногда в спящем режиме. Вы можете использовать реализацию BITS, хотя это небольшой OTT.
Кроме того, если проблема связана с памятью - сжимайте файл или разбивайте его на более мелкие файлы, которые позже можно будет восстановить.
Я мог бы использовать подход «старой школы» с двумя потоками, чтением и записью через буфер, и просто спать 5 мс или около того между чтениями.
Если вы это сделаете, обратите внимание на использование флага FILE_FLAG_NO_BUFFERING: в противном случае, независимо от размера буфера вашего приложения, файловая система будет буферизоваться (и, следовательно, вызывать дополнительную подкачку).