ReadFile FILE_FLAG_NO_BUFFERING как читать данные между двумя секторами - PullRequest
1 голос
/ 21 августа 2011

Я использую функцию Windows ReadFile для последовательного чтения файлов размером 4 ГБ с FILE_FLAG_NO_BUFFERING. Я использую буфер 64 КБ, и все работает правильно, но проблема в том, что мои данные обрезаются между концом текущего буфера и следующим чтением. Например, у меня есть последовательность чисел с плавающей запятой в 4 байта, и когда я прихожу к последнему числу с плавающей запятой, только три байта находятся в текущем буфере, и следующий байт поступит в следующий буфер чтения. Так как я могу справиться с этим? Должен ли я отслеживать количество использованных байтов, чтобы сохранить последние три байта, а затем добавить последний после чтения следующего буфера? Или может скопировать буфер в другой и сделать там отслеживание поплавков? Но это не лишает вас преимущества не читать с кешем Windows? Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Так или иначе, вы должны вести этот учет самостоятельно, поскольку небуферизованные чтения должны быть выровнены.

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

Кроме того, если вы читаете последовательно, FILE_FLAG_NO_BUFFERING запрещает механизм опережающего чтения ОС. Это почти наверняка будет стоить вам гораздо больше, чем вы получите, обходя буферы ОС.

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

0 голосов
/ 21 августа 2011

Я думаю, что в особом случае, когда вы находитесь на границе, вы должны скопировать биты из предыдущего блока и биты из следующего блока бок о бок в маленькое пустое место и прочитать их оттуда в один кусочек. Когда вы не на границе, вам не нужно использовать это пространство для царапин.

...