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

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

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

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

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

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


person Francois Hamel    schedule 26.02.2010    source источник


Ответы (2)


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

person John Knoeller    schedule 26.02.2010
comment
Спасибо, но, к сожалению, даже с этим флагом функция Win32 CopyFile по-прежнему работает быстрее, чем все, что я могу придумать с помощью CreateFile и ReadFile... Я провел небольшой тест и перепробовал все флаги, которые мог установить при открытии файла, и все равно не смог. не сделать его таким же быстрым, как CopyFile (и это даже без записи чего-либо на мой локальный жесткий диск!) Я не уверен, что происходит внутри CopyFile, что мы не можем воспроизвести. Чтение файлов на локальном HD всегда происходит быстро, но только не на сетевом диске, в отличие от CopyFile в обоих случаях. - person Francois Hamel; 27.02.2010

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

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

person Martin Dobšík    schedule 22.03.2010