Чтение и обработка нескольких файлов с помощью операций OVERLAPPED (и IOCP?)

Я пытаюсь найти способ улучшить созданную мною программу C32 для Win32, которая в основном рекурсивно перебирает данную папку и для каждого данного файла вычисляет хэш (скажем, MD5, но это может быть любой вид дорогостоящих вычислений ЦП) ,
Поскольку это приложение, связанное с вводом / выводом, большую часть времени процесс ожидает завершения ввода / вывода, следовательно, не использует столько процессора, сколько мог бы.
Даже выполнение этого с использованием пула потоков, вероятно, (я ошибаюсь?) Не решит проблему, каждый поток будет блокировать ожидание завершения ввода-вывода, плюс будут издержки переключения контекста.

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

У меня есть следующие вопросы:

  • Я предполагаю, что это увеличит общую производительность приложения, я прав? Если нет, то почему?
  • Надежно ли гарантировать, что события завершения ввода-вывода упорядочены так же, как операции чтения? Я имею в виду, если я прочитаю N байтов из смещений A, B и C файла, получу ли я события завершения A, B и C в таком порядке или они могут прийти в непредсказуемом порядке?
  • Я ищу библиотеку или некоторые примеры кода для реализации всего этого механизма, должен ли я использовать IOCP или просто RegisterWaitForSingleObject с пользовательскими обратными вызовами? Кажется, я не нахожу примеров для ввода / вывода нескольких файлов, все, что я нахожу, это просто пример перекрывающихся операций чтения в одном файле или IOCP с сокетами, можете ли вы указать мне правильное направление?
  • Разве пул потоков не будет бесполезен в этом случае? Подход с одним потоком должен быть достаточно хорошим (например, следуя подходам nginx / libevent), верно?

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

РЕДАКТИРОВАТЬ:

Какова текущая реализация программного обеспечения (конечно, приложение не совсем так, просто чтобы дать представление):

DWORD crc32( PBYTE data, DWORD size )
{
// compute the crc32 of the data and return it
}

void on_file_callback( const char *pszFileName )
{
PBYTE file_map = ...; // Open the file and memory map it.

if( crc32( file_map, file_size ) == 0xDEADBEEF )
{
printf( "OMG!!!\n" );
}
// Cleanup
}

int main( int argc, char **argv )
{
const char *pszFolder = "c:\\";

// recurse pszFolder and call 'on_file_callback' on every file found
recurse_directory( pszFolder, on_file_callback );
}

Благодарю.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]