Как сделать nftw () быстрее - PullRequest
0 голосов
/ 10 января 2020

Я работаю над проектом распечатки каталогов, и мне нужно захватить все файлы на компьютере, а затем сохранить их в очереди, которая затем будет отправлена ​​рабочим потокам для работы.

Прямо сейчас я использую этот пример кода 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 Ответ

2 голосов
/ 10 января 2020

На странице, на которую вы ссылаетесь, есть следующее объяснение этого поведения:

Чтобы не использовать все файловые дескрипторы вызывающего процесса, nopenfd указывает максимальное число каталогов, которые ftw () будут держать открытыми одновременно. Когда глубина поиска превышает это значение, ftw () станет медленнее, потому что каталоги должны быть закрыты и открыты заново. ftw () использует не более одного дескриптора файла для каждого уровня в дереве каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...