gpt4 book ai didi

python - os.walk() 缓存/加速

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:50 25 4
gpt4 key购买 nike

我有一个原型(prototype)服务器 [0],它为客户端 [0] 进行的每个查询执行 os.walk()[1]。

我目前正在研究以下方法:

  • 将此数据缓存在内存中,
  • 加快查询速度,以及
  • 希望以后能够扩展到存储元数据和数据持久性。

我找到 SQL complicated对于树结构,所以我想在实际使用 SQLite 之前我会得到一些建议

是否有任何跨平台、可嵌入或可捆绑的非 SQL 数据库能够处理此类数据?

  • 我有一个小列表(10k-100k 文件)。
  • 我的联系人数量极少(可能只有 10-20 个)。
  • 我也希望能够扩展以处理元数据。

[0] 服务器和客户端实际上是同一个软件,这是一个 P2P 应用程序,旨在在没有主服务器的情况下通过本地可信网络共享文件,使用 zeroconf发现,并扭曲了几乎所有其他东西

[1] 当前在 10,000 个文件上使用 os.walk() 查询时间为 1.2s

这是我的 Python 代码中执行行走的相关函数:

def populate(self, string):
for name, sharedir in self.sharedirs.items():
for root, dirs, files, in os.walk(sharedir):
for dir in dirs:
if fnmatch.fnmatch(dir, string):
yield os.path.join(name, *os.path.join(root, dir)[len(sharedir):].split("/"))
for file in files:
if fnmatch.fnmatch(file, string):
yield os.path.join(name, *os.path.join(root, ile)[len(sharedir):].split("/"))

最佳答案

您不需要持久化树结构——事实上,您的代码正忙于拆解目录树的自然树结构,使其成为线性序列,那么您为什么要重新启动下次从树上?

看起来你需要的只是一个有序的序列:

i   X    result of os.path.join for X

其中 X,一个字符串,命名一个文件或目录(你对待它们只是一样的),i 是一个递增的整数(为了保持顺序),结果列,也是一个字符串,是结果os.path.join(name, *os.path.join(root, &c.

当然,这很容易放入 SQL 表中!

要第一次创建表,只需从填充函数中删除守卫 if fnmatch.fnmatch(和 string 参数),然后生成目录或文件os.path.join 结果,并使用 cursor.executemany 保存调用的 enumerate(或者,使用自增列,您可以选择)。要使用该表,populate 本质上变成了:

select result from thetable where X LIKE '%foo%' order by i

其中 stringfoo

关于python - os.walk() 缓存/加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3537279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com