

















这是一个创建于 1656 天前的主题,其中的信息可能已经有所发展或是发生改变。
# 目录表
class TC_struct(Document):
name = StringField() #目录名
parent = ObjectIdField() #上层目录的 id
# 文件表
class TC_item(Document):
# 所在目录
parent = ReferenceField(TC_struct) #所在的目录
根据目录,递归查找目录中的所有文件。
#先找到所有的目录。path_id 为所选择目录的 id path_ls = recurs_path(TC_struct, path_id)
#然后找到目录下的所有文件 qry_list = Q(parent__in=path_ls)
#递归查找目录的方法。
def recurs_path(tb_cls, path_id):
rds = tb_cls.objects(parent=ObjectId(path_id)).only('id')
rt = list()
rt.append(ObjectId(path_id))
for rd in rds:
# 递归查找子目录中的子目录
rt.extend(recurs_path(tb_cls, rd._id))
return rt
现在的问题是,如果目录结构很深,如有 4000 多个目录,在递归的时候,耗时特别长。
有没有方法,可以提升递归时的效率。 根本的需求是:递归查找目录中的所有文件。
1 among 2021 年 12 月 1 日4000 多个字目录,响应时间能有 4s 多。 |
2 ipwx 2021 年 12 月 1 日就算是操作系统上面递归子目录也这么慢啊。。。 你要检索的时候秒出结果,你就需要加索引: 1. 要么把所有目录的前缀抽出来当 tag 扔进倒排索引。 说实话你可以自己写一个程序挂在那里跑,专门维护内存索引,绝对不慢 |
3 among 2021 年 12 月 1 日mongodb 中的 aggregate 能否支持这种。 |
4 libook 2021 年 12 月 1 日你可以先查叶子目录名,看有几个符合要求的,然后再想根递归查询,中间不符合要求的过滤掉,越靠近根目录,候选就越少,最终剩下一个到根目录的候选就是你要的结果,或者到根之前 0 候选就表明目录不存在。然后拿着叶子目录的 ID 去文件表里查,可以一次性查到。 不知道你的场景这样是不是会有效。 |
6 among 2021 年 12 月 1 日现在的算法就是根据跟的 id ,查找他目录下面的字目录,然后在递归查找这个子目录中子目录,一层层递归。 请过时间分析,时间都花在递归目录上了,查找文件很快。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。