我有一个原型服务器[0],它对客户机[0]的每个查询执行os.walk()
[1]。在
我目前正在研究:
我找到了树结构的SQLcomplicated,所以我想在实际提交到SQLite之前我会得到一些建议
是否有任何跨平台、可嵌入或可捆绑的非SQL数据库能够处理此类数据?在
[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("/"))
您不需要持久化树结构事实上,您的代码正忙于将目录树的自然树结构分解为一个线性序列,那么下次为什么要从树中重新启动呢?在
看起来你需要的只是一个有序的序列:
其中X,一个字符串,命名一个文件或目录(您对它们的处理方式相同),i是一个递增的整数(为了保持顺序),result列也是一个字符串,是
os.path.join(name, *os.path.join(root,
&c的结果当然,这非常容易放入SQL表中!在
要第一次创建表,只需从populate函数中删除保护
^{pr2}$if fnmatch.fnmatch
(和string
参数),在os.path.join操作系统结果,并使用cursor.executemany
保存调用的enumerate
(或者,使用自增列,您的选择)。要使用该表,populate
实际上变成了:其中
string
是foo
。在一开始我误解了这个问题,但我想我现在有了一个解决方案(而且与我的另一个答案完全不同,因此有必要提出一个新的解决方案)。基本上,第一次在目录上运行walk时执行常规查询,但是存储生成的值。第二次,您只需生成这些存储值。我已经把手术室步行()打电话是因为它很短,但你可以很容易地把你的发电机包装成一个整体。在
我不确定您的内存需求,但您可能需要考虑定期清理
cache
。在你看过MongoDB了吗?那^{} 呢?
mod_python
应该允许您执行os.walk()
操作,并将数据存储在Python数据结构中,因为脚本在连接之间是持久的。在相关问题 更多 >
编程相关推荐