递归搜索和MySql比较

时间:2012-05-05 17:48:46

标签: python mysql oop

晚上好。我正在研究开发一些代码,这些代码将从JPEG图像中收集EXIF数据,并使用Python v2.x将其存储在MySQL数据库中。绊脚石在于JPEG分散在许多子目录和根目录中的其他子目录中因此,例如200个JPEG可以存储在根>中。 subsubroot1以及root中的另外100个> subroot2。一旦识别出所有图像,就会将它们扫描并将各自的EXIF数据抽象出来,然后再添加到MySQL表中。

目前我正处于计划阶段,但我只是想知道,进行递归搜索的最有效和pythonic方式是什么?我希望扫描根目录并将任何新标识的子目录附加到列表,然后扫描列表中的所有子目录路径以获取更多子目录,直到我有所有目录的总列表。这似乎是一种笨拙的方式虽然恕我直言,有点重复,所以我假设可能有更多的OOP方式来执行这个功能。

同样,我只想在我的MySQL表中添加新信息,那么确定条目是否已存在的最有效方法是什么?表格和JPEG文件名称中的文件名将是其MD5哈希值。我正在考虑在代码开头扫描表并将所有文件名放在一个集合中,因此,在扫描新的JPEG之前,如果集合中已存在条目,则无需提取EXIF并转到下一张图。这是一种有效的方法,还是在遇到新图像时扫描MySQL表会更好?我预计set方法可能是最有效的,但是表最终可能包含数千万个条目,因此将这些条目的文件名添加到集合(易失性存储器)可能不是最好的主意。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

我只想编写一个扫描目录所有文件的函数;如果它是jpeg,请将jpeg的完整路径名添加到结果列表中。如果它是一个目录,则立即使用新发现的目录作为参数调用该函数。如果它是另一种类型的文件,则什么也不做。这是一种经典的递归分而治之策略。如果您的目录路径中存在循环,它将会中断,例如使用符号链接 - 如果这对您有危险,那么您必须确保不会通过查找“真实”非两次遍历同一目录-symlinked每个目录的路径并记录它。

如何避免重复条目是一个棘手的问题,您必须考虑是否容忍两个具有完全相同内容的不同命名文件(并且还要考虑符号链接或多硬链接文件的边缘情况),新文件如何出现在您正在扫描的目录中,以及您是否对该过程有任何控制权。加快速度的一个想法是使用os.path.getmtime()。记录开始目录遍历过程的那一刻。下一次,让您的递归遍历过程忽略任何时间超过记录时间的jtime文件。这可能不是您保持跟踪的唯一方法,因为在您的进程的开始和结束时间之间修改的文件可能会也可能不会被记录,因此您仍然必须检查数据库中的那些记录(例如使用完整路径,文件信息的散列或数据本身的散列,取决于你不容忍的重复类型,但作为启发式使用它应该大大加快了这个过程。

理论上,您可以将所有文件名(可能是路径而不是文件名)从数据库加载到内存中以加快比较,但如果表格变得非常大的危险,最好将该信息保留在数据库中。例如,您可以从文件名创建一个哈希,然后只需使用UNIQUE约束将其添加到数据库 - 数据库将拒绝任何重复的条目,您可以捕获异常并继续前进。如果您使用上述启发式检查文件mtime,这将不会很慢。

如果这对您的应用程序很重要,请确保考虑到只能修改而不是新创建的文件的可能性。