我有以下循环:
for fileName in fileList:
f = open(fileName)
txt = open(f).read()
analyze(txt)
fileList
是一个包含超过100万个小文件的列表。根据经验,我发现调用open(fileName)
占用循环运行时间的90%以上。你会做什么来优化这个循环。这是一个“仅限软件”的问题,购买新硬件不是一个选项。
有关此文件集的一些信息:
每个文件名都是9-13位数字。文件根据ID的前4位排列在子文件夹中。这些文件存储在NTFS磁盘上,我不会因为我不会进入的原因而更改磁盘格式,除非有人坚信这样的改变会产生巨大的影响。
谢谢大家的答案。
我的解决方案是传递所有文件,解析它们并将结果放在SQLite数据库中。没有我对数据执行的分析(选择几个条目,进行数学运算)只需要几秒钟。已经说过,读取部分占用了大约90%的时间,因此与不必从磁盘读取实际文件的效果相比,提前解析XML文件对性能影响不大。
答案 0 :(得分:2)
使用solid state drive(SSD)确实会让您受益匪浅。它们比传统硬盘驱动器快得多,因为它们没有任何需要旋转和移动的硬件组件。
这些文件是您控制的,还是来自外部系统?如果您掌控一切,我建议您使用数据库来存储信息。
如果数据库对您来说太麻烦,请尝试将信息存储在一个文件中并从中读取。如果没有太多碎片,那么与拥有数百万个小文件相比,你将获得更好的性能。
答案 1 :(得分:1)
如果打开和关闭文件占用了大部分时间,那么最好使用数据库或数据存储来存储而不是使用平面文件集合
答案 2 :(得分:0)
解决你的最后一点:
除非有人坚信这种改变会产生巨大的差异
如果我们真的在谈论100万个小文件,将它们合并到一个大文件(或少量文件)中几乎肯定会产生巨大的差异。尝试将其作为实验。
答案 3 :(得分:0)
所以,让我们直截了当地说:你有完善的经验数据表明你的瓶颈是文件系统,但你不想改变你的文件结构?查看Amdahl定律。如果打开文件需要90%的时间,那么在不改变程序的那一部分的情况下,你将无法将速度提高10%以上。
查看包含所有这些文件的目录的属性对话框。我认为“磁盘大小”值远远大于文件的总大小,因为文件系统的开销(例如每个文件元数据可能非常冗余,文件以整数存储) 4k块)。
由于您在这里拥有的是一个大型哈希表,因此您应该将其存储为更适合这种用法的文件格式。根据您是否需要修改这些文件以及数据集是否适合RAM,您应该考虑使用完整的数据库,像sqlite这样的轻量级嵌入式,您的语言的哈希表/字典序列化格式,{ {1}}存档,或具有良好持久性支持的键值存储程序。
答案 4 :(得分:0)
将文件存储在单个.zip
存档中并从中读取。您只是正在阅读这些文件,对吗?