У меня есть большие (сотни МБ или более) файлов, которые мне нужны для чтения блоков с использованием C++ в Windows. В настоящее время соответствующими функциями являются:Улучшение производительности чтения файлов (один файл, C++, Windows)
errorType LargeFile::read(void* data_out, __int64 start_position, __int64 size_bytes) const
{
if(!m_open) {
// return error
}
else {
seekPosition(start_position);
DWORD bytes_read;
BOOL result = ReadFile(m_file, data_out, DWORD(size_bytes), &bytes_read, NULL);
if(size_bytes != bytes_read || result != TRUE) {
// return error
}
}
// return no error
}
void LargeFile::seekPosition(__int64 position) const
{
LARGE_INTEGER target;
target.QuadPart = LONGLONG(position);
SetFilePointerEx(m_file, target, NULL, FILE_BEGIN);
}
Выполнение вышеуказанного не кажется очень хорошим. Чтения находятся на блоках 4K файла. Некоторые чтения являются согласованными, большинство из них не являются.
Пара вопросов: Есть ли хороший способ профилировать чтение? Что может улучшить производительность? Например, полезно ли выравнивание по секторам данных? Я относительно новичок в оптимизации ввода-вывода, поэтому предложения или указатели на статьи/учебные пособия были бы полезными.
@ Джерри: Похоже, ваше сообщение там отрезало. Я думаю, что он означает «Когерентный» - это последовательный доступ. –
@Billy: yup, случайно попал в клавишу табуляции, когда я намеревался попасть в замок. Часть того, что я сказал, должна применяться, если он означает последовательный. –