【问题标题】:Linux bulk mtimeLinux 批量 mtime
【发布时间】:2018-06-17 13:06:50
【问题描述】:

在处理大量数据时,尽量减少数据库请求的数量并执行批量操作反而对性能有很大帮助。

问题:是否可以在 Linux 上一次/批量检索 10,000 个文件的 mtimes?

我希望尽量减少系统调用。

在这里找不到东西:http://www.gnu.org/software/libc/manual/html_node/index.html

PS:目前,我使用 python:os.walk 检索这些文件名。

【问题讨论】:

  • 我认为批量 mtime 请求是不可能的,但是检索 10,000 个文件的 mtime 并不是最慢的操作。您是否尝试过分析您的代码并找到其他慢速部分?也许值得优化那些......
  • 如果那不是,并且您有一些来源/参考资料,您可以将其作为答案,我会接受。猜猜为什么提到数据库查询? ;-) 已经优化。我还发现系统调用比函数调用慢 20-100 倍:softwareengineering.stackexchange.com/questions/311165/…
  • 其他缓慢的部分指的是其他任何东西,数据库和系统调用并不是唯一可以使程序变慢的东西。如果您对数据执行一些 O(n^2) 操作,那么无论数据库和系统调用优化如何,您的程序都会很慢。我有点过度优化的感觉:如果您使用与 python 一样高级的语言编写,那么纳秒长调用的 100 倍优化将不会对执行速度产生任何明显的整体改进。如果您需要将代码优化到函数调用 - 放弃 python 并用 C 编写,您将获得更大的加速。
  • 不,您仍然需要每个文件的 dirwalk +one stat() 系统调用。要对您的程序进行基准测试,请将其与find . -ls >/dev/null 进行比较,就系统调用而言,它本质上是相同的。我预计 Python 开销不会超过 ~10%。
  • 只有 STATX_MTIME 标志(没有其他标志)的statx 可能会比stat 更有效,但它需要进行基准测试。

标签: python linux performance system-calls stat


【解决方案1】:

很难找到声称不存在某物的来源;)

Linux man page for fstat 没有链接到任何关于批量统计请求的内容,所以我认为它不存在。

此外,如果您接受使用 python 的巨大性能损失,您不应该关心优化操作系统中最优化的东西之一。由于其动态的高级特性,Python 天生就很慢,因此更有效的优化包括:

  • 在 python 中使用更快的算法
  • 通过multiprocessing拆分计算工作和通过threads/coroutines进行网络工作
  • pypy 下运行您的代码(提供 jit 编译)
  • cython 中重写部分程序(编译成C 的静态类型python)
  • 用 C 重写部分程序并通过 extentions 将它们连接回 python
  • 只需使用 C/C++/go/rust/任何其他编译语言编写程序

快速的经验法则:在您的程序不消耗 100% 的所有 CPU 内核(或 CPU 的一个内核用于固有的不可并行任务)之前,您不应该考虑优化除算法、网络上的当前代码之外的任何内容和并发级别。

语言设计的一部分是编程速度与执行速度的平衡。实现更快的执行速度需要程序员提供更多的输入并减慢开发速度。如果您的程序最慢的地方是 10000 系统调用 - 那么您绝对应该用 C 编写它,但我相信您可以在程序中找到很多其他的东西来优化。

我建议使用分析器(例如内置 profile)来查看代码中的真实热点。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2018-09-23
    相关资源
    最近更新 更多