我有一个原型服务器[0]正在为客户端[0]进行的每个查询执行os.walk()[1].
我目前正在研究以下方法:
>将此数据缓存在内存中,
>加快查询速度,以及
>希望以后允许扩展到存储元数据和数据持久性.
我发现sql complicated用于树结构,所以我认为在实际提交sqlite之前我会得到一些建议
是否存在可能能够处理此类数据的任何跨平台,可嵌入或可捆绑的非sql数据库?
>我有一个小的(10k-100k文件)列表.
>我的连接数量非常少(可能是10-20).
>我希望能够扩展到处理元数据.
[0]服务器和客户端实际上是同一块软件,这是一个P2P应用程序,旨在通过本地可信网络与主服务器共享文件,使用zeroconf进行发现,并扭曲几乎其他所有内容
[1]查询时间目前是1.2s,os.walk()在10,000个文件上
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表中!
要在第一次创建表时,只需从populate函数中删除保护,如果fnmatch.fnmatch(和字符串参数),在os.path.join结果之前生成dir或文件,并使用cursor.executemany保存枚举调用(或者,使用自增量列,您的选择).要使用该表,populate基本上变为:
select result from thetable where X LIKE '%foo%' order by i
字符串是foo.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。