优化高清文件读取

时间:2011-02-01 08:25:25

标签: performance language-agnostic file-io ntfs

我有以下循环:

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文件对性能影响不大。

5 个答案:

答案 0 :(得分:2)

硬件解决方案

使用solid state drive(SSD)确实会让您受益匪浅。它们比传统硬盘驱动器快得多,因为它们没有任何需要旋转和移动的硬件组件。

软件解决方案

这些文件是您控制的,还是来自外部系统?如果您掌控一切,我建议您使用数据库来存储信息。

如果数据库对您来说太麻烦,请尝试将信息存储在一个文件中并从中读取。如果没有太多碎片,那么与拥有数百万个小文件相比,你将获得更好的性能。

答案 1 :(得分:1)

如果打开和关闭文件占用了大部分时间,那么最好使用数据库或数据存储来存储而不是使用平面文件集合

答案 2 :(得分:0)

解决你的最后一点:

  

除非有人坚信这种改变会产生巨大的差异

如果我们真的在谈论100万个小文件,将它们合并到一个大文件(或少量文件)中几乎肯定会产生巨大的差异。尝试将其作为实验。

答案 3 :(得分:0)

所以,让我们直截了当地说:你有完善的经验数据表明你的瓶颈是文件系统,但你不想改变你的文件结构?查看Amdahl定律。如果打开文件需要90%的时间,那么在不改变程序的那一部分的情况下,你将无法将速度提高10%以上。

查看包含所有这些文件的目录的属性对话框。我认为“磁盘大小”值远远大于文件的总大小,因为文件系统的开销(例如每个文件元数据可能非常冗余,文件以整数存储) 4k块)。

由于您在这里拥有的是一个大型哈希表,因此您应该将其存储为更适合这种用法的文件格式。根据您是否需要修改这些文件以及数据集是否适合RAM,您应该考虑使用完整的数据库,像sqlite这样的轻量级嵌入式,您的语言的哈希表/字典序列化格式,{ {1}}存档,或具有良好持久性支持的键值存储程序。

答案 4 :(得分:0)

将文件存储在单个.zip存档中并从中读取。您只是正在阅读这些文件,对吗?