2010-10-24 18 views
0

我正在处理一个基本上监视设置的远程目录(FTP,联网路径和另一个)的项目,如果该文件被认为是新的并且符合我们下载并处理它的标准。但是我坚持最好的方式是跟踪我们已经下载的文件。我不想下载任何重复的文件,所以我需要跟踪已下载的内容。python的数据持久性当很多查找但很少写入?

Orignally我是把它作为一个树:

server->directory->file_name 

当服务关闭它,它写入一个文件,当它启动时重新读取回来。但是,如果有大约20,000个左右的文件开始减速很多,

有没有更好的方法来做到这一点?

编辑

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

+1

如何使用'dict'的'dict'并使用'pickle'将数据序列化/反序列化到磁盘?你有没有试过这个选项? – 2010-10-24 18:31:54

+0

这就是我所做的事情,但是字典的字典在某个点后开始减慢。当存储大量文件时。 – UberJumper 2010-10-24 18:32:30

+1

如何使用像sqlite这样的嵌入式SQL数据库? Python有它的库。 – 2010-10-24 18:39:20

回答

1

我会创建一组元组,然后将它腌到一个文件。元组将是(server, directory, file_name),或者甚至只是(server, full_file_name_including_directory)。不需要多级数据结构。元组将哈希到集合中,并给你一个O(1)查找。

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

取回内存的一种方法是intern()服务器名称。这样,每个服务器名称将仅存储在内存中一次。

一个有趣的选择是使用布隆过滤器。这会让你使用少得多的内存,但偶尔会下载一个你不需要的文件。这可能是一个合理的权衡,取决于你不想两次下载文件的原因。

+0

在查找期间它正在放慢对不起,我纠正了这个问题。 – UberJumper 2010-10-24 18:34:40

+0

在每个元组中都有'server'不会给你dict-dict的能力来快速浏览所有服务器和它们各自的文件。想象一下,您想要登录一次到服务器并操纵其所有文件... – eumiro 2010-10-24 18:35:52

+0

@eumiro,我不会想象任何新的要求。 OP表示他需要追踪重复。 – 2010-10-24 18:37:53