дано: большой файл,ну допустим -200 ГБ. Ожидается, что файл заполнен нулями,но это может быть и не так,возможны вкрапления других байт. необходимо пробежаться по файлу и если найдутся ненулевые байты -вывести смещения,по которым они находятся. с максимальной скоростью, в идеале скорость должна ограничиваться лишь физическими параметрами жесткого диска. как делаю я: делаю буфер на 10 мб,в цикле считываю в него кусочек и побайтно сравниваю с 0.
Может имеет смысл использовать асинхронный режим чтения? То есть ты считываешь 10мб в асинхронном режиме, а когда буффер проверки заканчивается, ждать данных уже не надо.
1. Двордами сравнивать, если где-то не ноль, то уже по байтам. 2. Без кеширования. 3. Через порт завершения.
еще интересно,что произойдет,если попытаться отобразить файл в память... как только до компа доберусь -обязательно попробую
Потому что, как и с байтами скорость определяется загрузкой данных с диска, а это - ацки медленно, потому и не очень заметно
Асинхронный режим - это когда мы делаем "заказ" на данные, но управление возвращается после регистрации заказа, а не после его выполнения. Извещение о завершении приходит в виде какого-нибудь сообщения или сигнала. Например, есть у нас 2 буффера. Мы каждый раз заказываем данные в один буффер, а в другом они уже должны лежать. Код (Text): buffer[2]; i=0; read_buffer_async(message, buffer[i]); while(all_data_to_read){ wait_for_message(message); //are able for using buffer[i] read_buffer_async(message, buffer[i xor 1]); //ordered data to buffer[i xor 1]; // //...using data in buffer[i] // i = i xor 1; } Смысл в том, что пока мы используем заполненный буффер, система в это время заполняет другой.
Двумя тут врятли обойтись - какой размер не бери, мы всё равно первый обработаем быстрее, чем подгрузиться второй, а делать больше буферов... хз
делать больше буферов толку 0, всеравно первый освободиться раньше чем второй будет готов к использованию. т.е. след после второго буфера целесообразнее считывать первый можно баловаться с их размерами... кратность например привязать правильную... и т.д. и читать ессно в отдельном потоке.
alexandr_k, верно отметил насчёт кратности в принцепи буфер может быть один и обрабатываться двумя потоками: один поток считывает в буфер, а другой сравнивает. ну, и, конечно, крит. секции юзать надо, чтобы коллизии не было. лучшего придумать уже нельзя.