【问题标题】:Perl: performance hit with reading multiple filesPerl:读取多个文件时性能下降
【发布时间】:2011-05-20 12:32:17
【问题描述】:

我想知道在这种情况下什么更好?

我必须阅读数千个文件。我正在考虑打开每个文件并阅读一个并关闭它。或者将所有文件集中到一个文件中并读取。

建议?这一切都在 Perl 中。

【问题讨论】:

  • 随心所欲,profiling 会显示程序大部分时间都在处理线条,因此不值得优化开头部分。
  • 第一个近似值,执行的操作码越多,运行时间越长。这只是对现实的粗略近似,但它比错误更真实:内部解释器调度循环将占主导地位。
  • daxim:你怎么知道的?戈登没有描述对这些文件做了什么。想象一下,他有 1000 个像 a\nb\nc\n 这样的文件,并且只想计算行数(综合示例)。该处理将比为文件运行的磁盘磁头快得多,因此读取许多不同的文件将导致重大开销。 @Gordon:提供更多细节,以便我们更好地判断它是否会有所作为。
  • 谢谢大家,我正在从这些独特的文件中提取一些数据。我做了这两种情况,而且时间差不多。我将不得不优化我处理线条的方式

标签: perl


【解决方案1】:

它不应该有太大的不同。这对我来说听起来像是过早的优化。

【讨论】:

    【解决方案2】:

    如果cat将所有文件放入一个更大的文件的时间无关紧要,它会更快(仅在默认顺序读取文件时)。

    当然,如果考虑到这个过程,它会慢得多,因为你必须读、写和再读。

    一般来说,读取一个 1000M 的文件应该比读取 100 个 10M 的文件要快,因为对于这 100 个文件,您需要查找元数据。

    正如 tchrist 所说,性能差异可能并不重要。我认为这取决于文件的类型(例如,对于大量非常小的文件,差异会更大)以及系统及其存储的整体性能。

    【讨论】:

    • 听起来正确。如果您多次读取每个文件,您可能会受益于 1 cat * >bigfile 然后经常读取该文件;但如果是一次,那就没什么区别了。
    • 将它们组合在一起需要上下文切换时间,无论缓冲区缓存系统多么聪明。
    【解决方案3】:

    请注意,如果文件数大于您的 ulimit -n 值,cat * 可能会失败。所以顺序读取实际上可以更安全。 此外,如果您的所有文件都位于同一目录中,请考虑使用opendirreaddir 而不是glob

    【讨论】:

    • 顺便说一句,Perl 的内部 glob 函数应该没有 NCARGS 限制。
    • 嗯,你说得对,我不知道为什么我认为这是一个问题。
    【解决方案4】:

    只需按顺序读取文件。 Perl 的文件 i/o 函数是操作系统中本地文件 i/o 调用的非常薄的包装器,因此不必担心简单文件 i/o 的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2023-03-11
      • 1970-01-01
      • 2016-08-02
      • 2013-06-12
      • 2010-09-25
      • 2011-12-04
      相关资源
      最近更新 更多