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

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

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

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

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

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

2 ответа

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

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

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

Другие вопросы по тегам