Быстрое чтение всего файла на сетевом диске (Windows, C / C ++, C #, ...) - PullRequest
2 голосов
/ 26 февраля 2010

В последнее время у меня возникают проблемы с чтением больших файлов на сетевом диске, и я просто не могу точно определить, что я делаю неправильно.Я пробовал как в C ++ (Unmanaged), так и в C # и имел примерно одинаковую производительность на обоих ... которые были несколько плачевными.

Иногда он будет читать в сети файл 4 КБ / с, но если этоФайл расположен на локальном HD, он легко достигнет максимальной скорости передачи данных, которую может выдавать HD.То есть с чтением порций по 64 КБ ... Я пробовал с большими буферами до безумных чисел или меньше, и это не имеет большого значения.

Я пробовал асинхронный ввод-вывод в C # с BeginRead наFileStream и OVERLAPPED IO в C ++, а также синхронные операции чтения, и у них у всех были одинаковые проблемы, которые медленны в сети.

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

Кто-нибудь знает, почему это так?

Ответы [ 2 ]

0 голосов
/ 22 марта 2010

Мы можем только предположить, что вы пробовали действительно все возможные методы чтения / записи. Вы читали синхронно или асинхронно? Вы пробовали порты завершения ввода / вывода? Или функция ReadFileEx ()? Я полагаю, что функция Windows CopyFile () обнаруживает, что вы хотите прочитать файл из сети, и будет использовать другой метод для чтения, чем тот, который используется для доступа к диску.

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

0 голосов
/ 26 февраля 2010

Мы должны были бы догадаться, так как вы не показываете нам свой код. Поэтому я предполагаю, что копия файла Windows открывает файл с флагом FILE_FLAG_SEQUENTIAL_SCAN , который, в свою очередь, заставляет файловую систему / кэш выбирать оптимальные размеры блоков и отправлять запросы на чтение в ожидании вызовов чтения, которые не отправлено.

...