首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >os.walk()缓存/加速

os.walk()缓存/加速
EN

Stack Overflow用户
提问于 2010-08-21 10:34:30
回答 3查看 1.7K关注 0票数 3

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

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

  • 将这些数据缓存在内存中,
  • 加速查询,以及
  • 希望以后允许扩展到存储元数据和数据持久性。

我为树结构找到SQL 复杂,所以我想在实际提交SQLite之前得到一些建议。

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

  • 我有一个小的(10k-100 k文件)清单。
  • 我有一个非常少的连接(也许10-20)。
  • 我希望能够扩展到处理元数据。

服务器和客户端实际上是同一个软件,这是一个P2P应用程序,它被设计成在本地可信网络上共享文件,没有主服务器,使用zeroconf进行发现,并且几乎所有其他东西都是扭曲的

使用os.walk()对10,000个文件进行1次查询的时间目前为1.2

下面是Python代码中的相关函数,用于遍历:

代码语言:javascript
复制
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("/"))
EN

回答 3

Stack Overflow用户

发布于 2010-08-21 15:02:51

您不需要持久化树结构--实际上,您的代码正在忙着将目录树的自然树结构分解成一个线性序列,那么为什么下次要从树中重新启动呢?

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

代码语言:javascript
复制
i   X    result of os.path.join for X

其中,X是一个字符串,命名为文件或目录(您对它们的处理方式相同),我是一个递增的整数(以保持顺序),结果列(也是字符串)是os.path.join(name, *os.path.join(root, &c的结果。

当然,将它放在SQL表中非常容易!

要第一次创建表,只需从填充函数中移除if fnmatch.fnmatch (和string参数),在os.path.join结果之前生成dir或文件,并使用cursor.executemany保存调用的enumerate (或者使用自增量列,您的选择)。要使用该表,populate本质上变成了一个:

代码语言:javascript
复制
select result from thetable where X LIKE '%foo%' order by i

其中stringfoo

票数 3
EN

Stack Overflow用户

发布于 2010-08-22 11:05:21

一开始我误解了这个问题,但我认为我现在有了一个解决办法(而且与我的另一个答案有很大的不同,需要一个新的答案)。基本上,您在第一次在目录上运行walk时执行常规查询,但是存储生成的值。第二次,您只需要生成那些存储的值。我已经包装了os.walk()调用,因为它很短,但是您可以轻松地将生成器包装为一个整体。

代码语言:javascript
复制
cache = {}
def os_walk_cache( dir ):
   if dir in cache:
      for x in cache[ dir ]:
         yield x
   else:
      cache[ dir ]    = []
      for x in os.walk( dir ):
         cache[ dir ].append( x )
         yield x
   raise StopIteration()

我不确定您的内存需求,但您可能需要考虑定期清除cache

票数 3
EN

Stack Overflow用户

发布于 2010-08-21 10:53:47

你看过MongoDB吗?mod_python呢?mod_python应该允许您执行os.walk(),只需将数据存储在os.walk()数据结构中,因为脚本在连接之间是持久化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3537279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档