【问题标题】:Optimizing file reading from HD优化从高清读取文件
【发布时间】:2011-02-01 08:25:25
【问题描述】:

我有以下循环:

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 文件对性能的影响很小。

【问题讨论】:

    标签: performance language-agnostic file-io ntfs


    【解决方案1】:

    硬件解决方案

    您应该真正受益于使用solid state drive (SSD)。它们比传统硬盘驱动器快得多,因为它们没有任何需要旋转和移动的硬件组件。

    软件解决方案

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

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

    【讨论】:

    • SSD 不能很好地处理随机位置上的大量小文件。
    • 实际上,大量的小随机读取是 SSD 相对于硬盘的最大优势所在。当然,它们在顺序读取方面甚至更快,但它们的随机访问性能是它们的主要卖点。
    • 是的,SSD 的最大优势是寻道延迟,而不是顺序读/写。大量的小文件正是 SSD 最擅长的地方。
    【解决方案2】:

    如果打开和关闭文件占用了您的大部分时间,一个好主意是使用数据库或数据存储来进行存储,而不是使用平面文件的集合

    【讨论】:

      【解决方案3】:

      解决你的最后一点:

      除非这里有人坚信这样的改变会产生巨大的影响

      如果我们真的在谈论 100 万个小文件,那么将它们合并到一个大文件(或少量文件)中几乎肯定会产生巨大的影响。尝试一下。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          那么,让我们直截了当:您有可靠的经验数据表明您的瓶颈是文件系统,但您不想更改文件结构?查阅阿姆达尔定律。如果打开文件需要 90% 的时间,那么如果不更改程序的那部分,您将无法将速度提高 10% 以上。

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

          由于您在此处拥有的本质上是一个大型哈希表,因此您应该将其存储为更适合这种用途的文件格式。根据您是否需要修改这些文件以及数据集是否适合 RAM,您应该考虑使用成熟的数据库、轻量级的可嵌入数据库(如 sqlite)、您的语言的哈希表/字典序列化格式、@ 987654321@archive,或者是一个支持持久化的key-value存储程序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-25
            • 1970-01-01
            • 1970-01-01
            • 2012-11-13
            • 1970-01-01
            • 1970-01-01
            • 2018-08-13
            相关资源
            最近更新 更多