我需要从包含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分钟?任何解释都将非常感激。
答案 0 :(得分:3)
是的,这是一个缓存的事情。您的硬盘是一个缓慢的外围设备,从它读取163.360文件名可能需要一些时间。是的,您的操作系统会为您缓存这类信息。 Python必须等待加载该信息才能过滤掉匹配的文件名。
在操作系统决定使用内存缓存目录信息以获取其他内容之前,您不必再等待所有时间,或者重新启动计算机。由于您重新启动了计算机,因此不再缓存信息。
答案 1 :(得分:2)
假设同一目录上的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.