简单回答:正常情况下,readdir(在 Ubuntu / Linux 上通常指 readdir() / readdir_r() 或 getdents() 系统调用)本身内存占用并不高,但在某些使用场景下“看起来很高”是可能的。
下面分情况说清楚。
readdir 本身的内存特点在 glibc + Linux 中:
readdir() 内部会调用 getdents64()✅ 对小目录、普通目录:
例如:
/var/log/
/tmp/
某些缓存目录
问题不在 readdir 本身,而在:
while ((entry = readdir(dir))) {
names.push_back(entry->d_name);
}
➡️ 内存 = 文件数 × 文件名长度
百万文件可能占用 几百 MB 甚至上 GB
✅ 解决:
getdents 直接读,控制 buffer 大小例如:
find / -name "*.log"
每进入一层目录都会:
DIR *如果层级深 + 文件多:
✅ 解决:
closedir()比如 Python:
os.listdir("/huge_dir")
底层还是 readdir,但:
➡️ 这是“语言层面”的内存高,不是 readdir 高
✅ 更好方式:
for entry in os.scandir("/huge_dir"):
...
有些程序手动:
getdents(fd, buf, 10 * 1024 * 1024);
这就不是 readdir 的问题,而是你自己分配太多。
readdir 的问题?可以用:
pmap -x <pid>
或
valgrind --tool=massif ./your_program
看内存增长是否发生在:
opendirreaddirclosedir 之后没释放
readdir本身内存占用不高,高内存通常是“目录太大 + 保存结果 + 语言封装”导致的。
如果你愿意,可以告诉我:
我可以直接给你优化方案或示例代码。