【问题标题】:Python efficient structure for caching folders, files, and sizes用于缓存文件夹、文件和大小的 Python 高效结构
【发布时间】:2012-08-02 17:10:41
【问题描述】:

我正在用 Python 编写一个磁盘空间使用程序,我已经拥有了我想要的功能,但是速度很慢。我将分析的文件系统可能有数百 GB,在许多深度密集的文件夹中包含数千个文件。

我在前面链接的论文中使用基于“拆分”布局的树形图来显示数据。布局的创建和求解都是非常快速的操作。 http://www.nada.kth.se/utbildning/grukth/exjobb/rapportlistor/2005/rapporter05/engdahl_bjorn_05033.pdf

我正在使用 os.walk 行走给定的路径,并将文件夹和文件连同它们的大小一起添加到此树形图中。我得到每个文件的大小并将其存储在字典缓存中(其中 cache[filePath] = size),因此我可以轻松地再次检索它。所有这些都很快,除了 os.walk。单独运行 os.walk 可能需要 30 多秒,有时甚至几分钟。

我知道我不能让它更快地通过结构,但我想以某种方式缓存结果,以便将来更快。这是因为该应用程序允许导航树状图,您可以在其中单击任何部分(这是一个文件夹),它将使其成为树状图的“根”。

所以,我需要一个缓存解决方案,它可以轻松访问任何文件/文件夹,以及在层次结构中轻松导航,这样如果我从“根”节点开始,我可以跳到任何指定任何深度的子节点,然后从那里我可以在结构中向上(或向下)移动。

我宁愿不将数据结构和导航合并到树状图中。如果解决方案是在程序的步行和调整大小部分,那将是最好的。最后,我真的只需要一个可步行的文件/文件夹结构及其大小的重建。

这种结构有什么好的库吗?或者自己写这个有多容易?我以前没有使用过这样的结构,所以我不知道创建它的最佳方法,以便我拥有所需的访问类型。

【问题讨论】:

    标签: python macos caching tree directory


    【解决方案1】:

    你看过Redis吗?它的速度很快,并且与 Python 配合得很好。此外,在分叉处启动的多个线程/进程如何更快地进行搜索?

    redis-py

    【讨论】:

    • Redis:看起来像一个数据库解决方案。我熟悉 SQLite 并且经常使用它,但是当应用程序关闭时我不需要任何持久性,仅在期间。例如,如果用户查看了 /path/to/sub/subsub 的磁盘空间,然后查看了 /path/to/sub,则 subsub 已经被计算过了,因此它只需要找到其余部分。在广泛的结果之后再深入,不需要找到任何东西,因为它都会被缓存。
    • 线程:这实际上会更快吗?我可以自己测试它,但是 GIL 不会导致这没有很大的改进吗?此外,它不会解决以有效方式保存结果以供以后阅读的问题。
    • 我不精通线程,所以我不会在那里发表评论,但多处理不受 GIL 的影响。如果您有一台多核机器,您可能可以通过生成多个进程来加速它。我只是不确定线程​​是否相同。
    • 至于redis,据我所知,你可以缓存任何你想记忆的东西,并在程序完成后删除键以释放内存。它通常与数据库应用程序使用 来加速常见查询,如果数据库受到攻击,这将需要很长时间。它的行为有点像数据库,但内容直接存储在内存中而不是磁盘上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2020-03-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多