Иногда мне нужно рекурсивно пройти по папке, читая содержимое всех файлов внутри.
Я использую C ++ и Linux.
Содержимое папки произвольное, от миллиарда от крошечных файлов до десятка гигантских.
Пытаясь достичь максимальной скорости чтения, я столкнулся с дилеммой. С одной стороны, почти всегда быстрее выполнять все чтение из одного потока, потому что параллельный доступ к файловой системе приводит к перебоям в голове между одновременно читаемыми файлами:
На с другой стороны, последовательный доступ к файловой системе из одного потока не такой быстрый, как мог бы быть по двум причинам.
Во-первых, время, прошедшее между завершением предыдущего запроса на чтение и инициированием следующего, составляет потерял. Я стараюсь свести его к минимуму, буквально ничего не делая в потоке чтения, кроме самого чтения, но постоянное переключение между пространством ядра и пользователем все еще некоторое время теряется, особенно в вышеупомянутом случае миллиарды крошечных файлов.
Во-вторых, однопоточное чтение не позволяет ядру и / или контроллеру жесткого диска выполнить некоторое переупорядочение запрошенных секторов, что может повысить производительность.
Итак, я хотел бы достичь двух вещей:
1) Например, в LibUsb у меня может быть несколько ожидающих запросов на чтение, которые обрабатываются последовательно , но без паузы между завершением предыдущий запрос и инициирование следующего. Возможно ли получить что-то подобное для доступа к FS?
2) Можно ли одновременно отправить несколько запросов на чтение ядру , , но помечают их каким-либо образом, чтобы ядро знало, что эти запросы не имеют отдельных сроков и что суммарное время их кумулятивного выполнения должно сворачиваться?