python的数据持久性,当很多查找但写入很少?

时间:2010-10-24 18:26:49

标签: python persistence

我正在开发一个项目,它基本上监视一组远程目录(FTP,网络路径和另一个),如果该文件被认为是新的并符合我们下载并处理它的标准。但是我仍然坚持最好的方法来跟踪我们已经下载的文件。我不想下载任何重复的文件,所以我需要跟踪已下载的内容。

Orignally我将它存储为树:

server->directory->file_name

当服务关闭时,它会将其写入文件,并在启动时重新读回。但是考虑到当树中有大约20,000个文件时,东西开始变慢。

有更好的方法吗?

修改

查找时间开始减慢很多,我的基本实现是dict的dict。存储在磁盘上的东西很好,它或多或少只是查找时间。我知道我可以优化树并对其进行分区。然而,对于这样一个小项目而言,这似乎是过分的,我希望python会有类似的东西。

1 个答案:

答案 0 :(得分:1)

我会创建一组元组,然后将其pickle到文件中。元组将是(server, directory, file_name),甚至只是(server, full_file_name_including_directory)。不需要多级数据结构。元组将散列到集合中,并为您提供O(1)查找。

你提到“东西开始减速很多”,但是你没有说它的读写时间,还是查找时间都在减慢。如果查找时间减慢,则可能正在进行分页。您的数据结构是否接近物理内存的很大一部分?

获取内存的一种方法是intern()服务器名称。这样,每个服务器名称只会在内存中存储一​​次。

一个有趣的替代方案是使用Bloom过滤器。这将允许您使用更少的内存,但偶尔会下载您不需要的文件。这可能是一个合理的权衡,取决于你不想两次下载文件的原因。