【问题标题】:Why does it take so long to load filenames from a directory?为什么从目录加载文件名需要这么长时间?
【发布时间】:2015-05-13 05:07:56
【问题描述】:

我需要从包含 163.360 个文件的文件夹中将 1460 个文件加载到一个列表中。

我使用以下 python 代码来执行此操作:

import os
import glob

Directory = 'C:\\Users\\Nicolai\\Desktop\\sealev\\dkss_all'
stationName = '20002'
filenames = glob.glob("dkss."+stationName+"*")

到目前为止,它一直运行良好,但是今天当我启动机器并运行代码时,它就卡在了最后一行。我尝试重新启动,它没有帮助,最后我只是让它运行,去午休,回来就完成了。花了45分钟。现在当我运行它时不到一秒钟,发生了什么?这是缓存的事情吗?如何避免再次等待 45 分钟?任何解释将不胜感激。

【问题讨论】:

  • 你能改变文件系统吗?有些人在这里可能比其他人做得更好......但这不是你可以从你的 Python 代码中修复的。
  • @RvdK,很好——这比stackoverflow.com/questions/4403598/…写得更好,也更切题。
  • 顺便说一句,如果您可以将每个站点移动到其自己的子目录中,这将提高效率。
  • 如果你看看 NNTP 假脱机是如何设计的——将 ID 散列到小目录中......好吧,现在你知道为什么了。 (当然,这主要是为了改进 known ID 的查找,具有索引目录的文件系统——这是 Linux 的 ext3 和 ext4 中的一个可选功能——也可以解决)。

标签: python file


【解决方案1】:

假设同一目录上的ls 也同样慢,您无法减少目录列出操作所需的总时间。文件系统有时很慢(这就是操作系统确实缓存目录条目的原因)。

然而,实际上您可以在 Python 代码中做一些事情:您可以在文件名进入时对其进行操作,而不是在其余代码之前等待整个结果完成开始。不幸的是,这是标准库中不存在的功能,这意味着您需要调用 C 函数。

请参阅Ben Hoyt's scandir module 以了解其实现方式。另见this StackOverflow question, describing the problem

使用 scandir 可能如下所示:

prefix = 'dkss.%s.' % stationName
for direntry in scandir(path='.'):
  if direntry.name.startswith(prefix):
    pass # do whatever work you want with this file here.

【讨论】:

    【解决方案2】:

    是的,它是一个缓存的东西。您的硬盘是一个慢速外围设备,从中读取 163.360 个文件名可能需要一些时间。是的,您的操作系统会为您缓存此类信息。 Python 必须等待该信息被加载,然后才能过滤掉匹配的文件名。

    您不必再等那么久,直到您的操作系统决定使用缓存目录信息的内存来做其他事情,或者您重新启动计算机。由于您重新启动计算机,信息不再被缓存。

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2011-11-12
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多