步行操作系统()缓存/加速

2024-09-30 16:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我目前正在研究:

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

我找到了树结构的SQLcomplicated,所以我想在实际提交到SQLite之前我会得到一些建议

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

  • 我有一个小的(10k-100k文件)列表。在
  • 我有极少量的连接(可能10-20个)。在
  • 我希望能够扩展到处理元数据。在

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

[1]查询时间目前为1.2秒,其中os.walk()在10000个文件上

下面是我的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("/"))

Tags: 文件数据pathnamein服务器forstring
3条回答

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

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

i   X    result of os.path.join for X

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

当然,这非常容易放入SQL表中!在

要第一次创建表,只需从populate函数中删除保护if fnmatch.fnmatch(和string参数),在os.path.join操作系统结果,并使用cursor.executemany保存调用的enumerate(或者,使用自增列,您的选择)。要使用该表,populate实际上变成了:

^{pr2}$

其中stringfoo。在

一开始我误解了这个问题,但我想我现在有了一个解决方案(而且与我的另一个答案完全不同,因此有必要提出一个新的解决方案)。基本上,第一次在目录上运行walk时执行常规查询,但是存储生成的值。第二次,您只需生成这些存储值。我已经把手术室步行()打电话是因为它很短,但你可以很容易地把你的发电机包装成一个整体。在

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。在

你看过MongoDB了吗?那^{}呢?mod_python应该允许您执行os.walk()操作,并将数据存储在Python数据结构中,因为脚本在连接之间是持久的。在

相关问题 更多 >