我正在做一个目录列表项目,我需要捕获计算机上的所有文件,然后将它们存储在一个队列中,然后将其发送给工作线程进行工作。
现在我使用的是this example code of 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秒。我正在寻找一种方法来提高这个功能的速度。
发布于 2020-01-11 01:53:27
在您所链接的页面中,有对此行为的解释:
nopenfd为了避免耗尽调用进程的所有文件描述符,
指定了ftw()将同时打开的最大目录数。当搜索深度超过此深度时,ftw()将变得更慢,因为必须关闭并重新打开目录。ftw()对目录树中的每个级别最多使用一个文件描述符。
https://stackoverflow.com/questions/59686628
复制相似问题