|
|
|
|
 请教 读取目录项的问题。。 - zhangxp [ 2005-07-25 20:00 | 399 byte(s)]
 Re: 请教 读取目录项的问题。。 - alula [ 2005-07-27 10:16 | 213 byte(s)]
 Re: 请教 读取目录项的问题。。 - h_falls [ 2005-07-25 21:12 | 1,137 byte(s)]
 Re: 请教 读取目录项的问题。。 - zhangxp [ 2005-07-27 20:09 | 109 byte(s)]
 Re: 请教 读取目录项的问题。。 - zhangxp [ 2005-07-27 20:05 | 414 byte(s)]
 Re: 请教 读取目录项的问题。。 - Atu [ 2005-07-27 20:22 | 448 byte(s)]
 Re: 请教 读取目录项的问题。。 - zhangxp [ 2005-07-28 21:02 | 22 byte(s)]
 Re: 请教 读取目录项的问题。。 - alula [ 2005-07-28 12:25 | 170 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
读取一个目录下的目录项:
opendir
readdir
closedir
1个目录下有100个文件与1个目录下有1000个文件的情况,我opendir后,逐个readdir,两种情况还会有效率差别么?
我们的系统就是在一个目录下分了好多个hash目录,避免将过多的文件放到一个目录下,听说效率会快,但是始终想不明白为什么。
谢谢指点。。。
|
|
|
----
想要不被人拒绝,最好的办法是先拒绝别人。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我尝试分析下, 你调用 opendir(test_dir) 后得到一个 struct DIR *的执政
struct DIR 就是 --->
struct __dirstream
{
void *__fd; /* `struct hurd_fd' pointer for descriptor. */
char *__data; /* Directory block. */
int __entry_data; /* Entry number `__data' corresponds to. */
char *__ptr; /* Current pointer into the block. */
int __entry_ptr; /* Entry number `__ptr' corresponds to. */
size_t __allocation; /* Space allocated for the block. */
size_t __size; /* Total valid data in the block. */
__libc_lock_define (, __lock) /* Mutex lock for this structure. */
};
其中, __data 包含了整个 test_dir 下的文件节点的信息。每次调用 readdir(struct DIR *)时,就会读一下 __data , 然后移动ptr指向下一个文件。 如果一个目录下有数十万个文件。 那么这个__data就会非常庞大,光是生成这个__data就会很耗时间。如果把这数十万个文件放到数百个目录里,然后一级级地去查找,就会很快捷了。
详细的解释请查阅 glibc 源码
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
这个效率问题涉及太多方面,如文件系统实现、磁盘技术。
就算法的不同来看,如果目的是遍历,而不是查找某个指定文件,我估计是将所以文件放在同一目录更快。区别有如遍历一个链表/数组比遍历一个hash表要快。
|
|
|
----
温故知新
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
<<那么这个__data就会非常庞大,光是生成这个__data就会很耗时间。如果把这数十万个文件放到数百个目录<<里,然后一级级地去查找,就会很快捷了。
这样解释好像行不通,因为即使分到多个目录里,_data总大小是一样的,两者的区别只不过是前者一次生成,后者多次生成。
照这样看来,还是一个,目录下快啊。
请继续讨论。。谢谢。。。
|
|
|
----
想要不被人拒绝,最好的办法是先拒绝别人。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
> 这样解释好像行不通,因为即使分到多个目录里,_data总大小是一样的,两者的区别只不过是前者一次生成,后者多次生成。
如果是要遍历所有文件,两者可能差别不大。
但是,很多的情况下,往往是对指定的文件进行访问,那么,在分散的情况下,只需要访问特定的目录即可。
假设把文件分散到100个目录,那么访问一个特定文件的开销 = 访问100个目录项中的一个 + 访问1/100总数目录项中的一个。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
如果是对指定的文件进行访问,那么对与n个文件:
1.都位于同一目录下,复杂度是:O(n)
2.使用hash分类子目录,复杂度是(假如分散到u个目录):O(u + n/u)
|
|
----
温故知新
|
|
[Original]
[Print]
[Top]
|
|
|