Как сделать nftw() быстрее
Я работаю над проектом списка каталогов, и мне нужно захватить все файлы на компьютере, а затем сохранить их в очереди, которая затем будет отправлена рабочим потокам для работы.
Прямо сейчас я использую этот пример кодаnftw()
:
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
static int
display_info(const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf)
{
printf("%-3s %2d %7jd %-40s %d %s\n",
(tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" :
(tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" :
(tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" :
(tflag == FTW_SLN) ? "sln" : "???",
ftwbuf->level, (intmax_t) sb->st_size,
fpath, ftwbuf->base, fpath + ftwbuf->base);
return 0; /* To tell nftw() to continue */
}
int
main(int argc, char *argv[])
{
int flags = 0;
if (argc > 2 && strchr(argv[2], 'd') != NULL)
flags |= FTW_DEPTH;
if (argc > 2 && strchr(argv[2], 'p') != NULL)
flags |= FTW_PHYS;
if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
== -1) {
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Я заметил, что он начинается очень быстро, а затем довольно быстро умирает, и каждая 1000 файлов, просматриваемых в цикле, занимает примерно 7 секунд. Ищу способ увеличить скорость этой функции.
1 ответ
На странице, на которую вы ссылаетесь, есть такое объяснение этого поведения:
Чтобы избежать использования всех файловых дескрипторов вызывающего процесса, nopenfd указывает максимальное количество каталогов, которые ftw() будет держать открытыми одновременно. Когда глубина поиска превышает это значение, ftw() будет работать медленнее, потому что каталоги придется закрывать и открывать заново. ftw() использует не более одного файлового дескриптора для каждого уровня в дереве каталогов.