Ограничить скорость File.Copy - PullRequest
11 голосов
/ 02 июля 2010

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 02 июля 2010

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

2 голосов
/ 02 июля 2010

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

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

2 голосов
/ 02 июля 2010

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

> start myCopyApp.exe /BELOWNORMAL
1 голос
/ 04 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...