我有一个原型服务器,它为客户端进行的每个查询执行一个os.walk()1。
我目前正在研究以下方法:
我为树结构找到SQL 复杂,所以我想在实际提交SQLite之前得到一些建议。
是否有任何跨平台、可嵌入或可捆绑的非SQL数据库可以处理此类数据?
服务器和客户端实际上是同一个软件,这是一个P2P应用程序,它被设计成在本地可信网络上共享文件,没有主服务器,使用zeroconf进行发现,并且几乎所有其他东西都是扭曲的
使用os.walk()对10,000个文件进行1次查询的时间目前为1.2
下面是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("/"))发布于 2010-08-21 15:02:51
您不需要持久化树结构--实际上,您的代码正在忙着将目录树的自然树结构分解成一个线性序列,那么为什么下次要从树中重新启动呢?
看起来你需要的只是一个有序的序列:
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本质上变成了一个:
select result from thetable where X LIKE '%foo%' order by i其中string是foo。
发布于 2010-08-22 11:05:21
一开始我误解了这个问题,但我认为我现在有了一个解决办法(而且与我的另一个答案有很大的不同,需要一个新的答案)。基本上,您在第一次在目录上运行walk时执行常规查询,但是存储生成的值。第二次,您只需要生成那些存储的值。我已经包装了os.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。
发布于 2010-08-21 10:53:47
你看过MongoDB吗?mod_python呢?mod_python应该允许您执行os.walk(),只需将数据存储在os.walk()数据结构中,因为脚本在连接之间是持久化的。
https://stackoverflow.com/questions/3537279
复制相似问题