我有以下循环:
for fileName in fileList:
    f = open(fileName)
    txt = open(f).read()
    analyze(txt)fileList是一个包含100多万个小文件的列表。根据经验,我发现调用open(fileName)需要超过90%的循环运行时间。你会怎么做才能优化这个循环。这是一个“只有软件”的问题,购买新的硬件不是一个选择。
有关此文件集合的一些信息:
每个文件名都是一个9-13位数字的ID。文件按照ID的前4位数排列在子文件夹中。这些文件存储在NTFS磁盘上,我宁愿不改变磁盘格式,因为我无法进入,除非这里的人坚信这样的更改会带来巨大的差异。
解决方案
谢谢大家的回答。
我的解决方案是传递所有文件,解析它们并将结果放入SQLite数据库。不,我对数据执行的分析(选择几个条目,做数学计算)只需几秒钟。已经说过,读取部分花费了大约90%的时间,因此与不必从磁盘读取实际文件相比,提前解析XML文件对性能的影响很小。
发布于 2011-02-01 08:33:19
如果文件的打开和关闭占用了大部分时间,那么最好的方法是使用数据库或数据存储来存储文件,而不是使用平面文件的集合。
发布于 2011-02-01 08:29:25
硬件解决方案
您应该从使用固态驱动 (SSD)中真正受益。这些设备比传统的硬盘驱动器要快得多,因为它们没有任何硬件组件需要旋转和移动。
软件解决方案
这些文件是在您的控制之下,还是来自外部系统?如果你能控制,我建议你用数据库来存储信息。
如果数据库对您来说太麻烦了,请尝试将信息存储在一个文件中并从中读取。如果不太分散,与拥有数百万个小文件相比,您将有更好的性能。
发布于 2011-02-01 08:35:52
为了解决你的最后一点:
除非这里的人坚信这样的改变会带来巨大的改变
如果我们说的是100万个小文件,那么将它们合并成一个大文件(或少量的文件)几乎肯定会产生巨大的影响。试着做个实验。
https://stackoverflow.com/questions/4860331
复制相似问题