编程语言
首页 > 编程语言> > python – os.walk()缓存/加速

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

作者:互联网

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

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

>将此数据缓存在内存中,
>加快查询速度,以及
>希望以后允许扩展到存储元数据和数据持久性.

我发现SQL complicated用于树结构,所以我认为在实际提交SQLite之前我会得到一些建议

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

>我有一个小的(10k-100k文件)列表.
>我的连接数量非常少(可能是10-20).
>我希望能够扩展到处理元数据.

[0]服务器和客户端实际上是同一块软件,这是一个P2P应用程序,旨在通过本地可信网络与主服务器共享文件,使用zeroconf进行发现,并扭曲几乎其他所有内容

[1]查询时间目前是1.2s,os.walk()在10,000个文件上

以下是我的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表中!

要在第一次创建表时,只需从populate函数中删除保护,如果fnmatch.fnmatch(和字符串参数),在os.path.join结果之前生成dir或文件,并使用cursor.executemany保存枚举调用(或者,使用自增量列,您的选择).要使用该表,populate基本上变为:

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

字符串是foo.

标签:embedded-database,python,nosql,database
来源: https://codeday.me/bug/20190827/1739559.html