python - 为什么 os.scandir() 速度变慢/如何重组大目录?

标签 python operating-system scandir

我有一个目录,其中包含超过 300 万个文件(我一开始就应该避免创建这些文件)。使用 os.scandir() 简单地打印出名称,

for f in os.scandir():
    print(f)

前约 200,000 个文件的每个项目需要 0.004 秒,但每个项目的时间会大幅减慢至 0.3 秒。再次尝试时,它做了同样的事情 - 前 200,000 个速度很快,然后速度减慢。

等待一个小时后再次运行,这一次对于前 400,000 个文件来说速度很快,但随后以同样的方式变慢。

这些文件都以 1908 年到 1963 年之间的年份开始,因此我尝试使用 bash 命令重新组织这些文件,例如

for i in {1908..1963}; do 
> mkdir ../test-folders/$i; 
> mv $i* ../test-folders/$i/; 
> done

但它最终被挂断了,永远无法到达任何地方......

关于如何重新组织这个巨大的文件夹或更有效地列出目录中的文件有什么建议吗?

最佳答案

听起来最好使用迭代器,一种一次只返回一项而不是将所有内容都放入内存的函数。

glob 库具有函数 iglob

for infile in glob.iglob( os.path.join(rootdir, '*.*') ):
    …

文档:https://docs.python.org/3/library/glob.html#glob.iglob

相关问答:https://stackoverflow.com/a/17020892/7838574

关于python - 为什么 os.scandir() 速度变慢/如何重组大目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994082/

相关文章:

c - 多线程与单线程进程运行时

python - 使用 os.scandir() 在 pycharm 中导致 'unresolved attribute reference' 警告

php - scandir 中的目录点是否始终是数组的第一个元素?

PHP scandir递归

python - 如何将 django admin "view site"链接更改为自定义绝对 url

基于Python的网络游戏

python - 如何展平嵌套的 python 字典?

python - PIL 图像未按正确顺序渲染输入的像素值

multithreading - 一个条件变量,多个互斥体

c++ - 这个程序是异步运行还是同步运行?