我有一个原型(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
其中 string
是 foo
。
关于python - os.walk() 缓存/加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3537279/