【问题标题】:How to regularly clean up files in a working directory in python如何定期清理python工作目录中的文件
【发布时间】:2016-03-11 03:04:23
【问题描述】:

我有一个 python 脚本可以将一些信息缓存到一个文件中。如果存在,该文件将被重用。否则脚本会调用其他一些函数来生成这样的文件,这需要很长时间。文件名有一定的规律,都存放在一个$WORKING_DIRECTORY

def dummy(param):
    fname = "file"+params
    if fname exists in $WORKING_DIR:
        reuse file
    else:
        long_time_process(param)
        create file in $WORKING_DIR

由于这个虚拟函数会以不同的参数多次调用,所以会生成很多文件。我想保持目录大小适中,文件中的信息相对最新。所以我想为目录的大小设置一个阈值。一旦达到限制,我将删除最旧的文件,直到目录大小减少到 THRESHOLD 的一半。

我目前的解决方案是:

def dummy(param):
    purge($WORKING_DIR)
    ...#Rest of dummy logic

def purge(dir):
    if get_size(dir) > THRESHOLD:
        while get_size(dir) > THRESHOLD/2:
            remove oldest file

def get_size(dir):
    size = 0
    for file in dir:
         size = size + file.size()
    return size

这确实有效,但大多数时候都不需要调用 purge,因为它只会在 1000 次调用后达到 THRESHOLD 一次。最重要的是,如果文件数量很大,get_size of directory 也可能很耗时。

所以问题是如何优化 get_size 并将清除逻辑与我当前的虚拟函数集成?有没有一个好的pythonic方法来做到这一点?或者我可以使用的模式?谢谢

【问题讨论】:

  • 我刚刚在大文件和许多文件上使用 os.stat(filename)[6] 进行了尝试,它仍然非常快。您希望此目录中有多少文件?为什么不只是每 1000 次迭代调用一次 get_size 呢?
  • @tnknepp 文件比较小,在 10 KB ~ 100KB 左右,目录的阈值应该在 100 MB 左右。所以它将是 1000 ~ 10000 个文件。目标是保持目录大小适中。为 get_size 设置计数器可能不是一个好的指标。这是一个python 脚本,它的调用者以python dummy.py 调用,全局变量不应该工作。

标签: python file directory purge


【解决方案1】:

你可以使用一个全局变量来记录函数被调用的次数

global count

def dummy(param):
    count +=1
    if count > THRESHOLD:
        purge($WORKING_DIR)

    ...#Rest of dummy logic

def purge(dir):
    while count > THRESHOLD/2:
        remove oldest file
        count-=1

def get_size(dir):
    size = 0
    for file in dir:
         size = size + file.size()
    return size

【讨论】:

  • 这并没有消除大量的 get_size() 调用,OP 声称这是瓶颈的一部分。每 1000 次迭代调用 get_size 不是更好吗?
  • @danidee 感谢您的回答,我最终使用 number 个文件作为清除指标,并为 puger 级别设置了明确的目标。我按上次访问时间对文件进行了排序,并删除了 [target:] 范围内的文件,以避免频繁的 get_size 操作。
【解决方案2】:

我最终使用文件数作为清除指标,并为 puger 级别设置了明确的目标。我按上次访问时间对文件进行了排序,并删除了 [target:] 范围内的文件,以避免频繁的 get_size 操作。

我的清除逻辑的框架如下。 我可以这样清除,因为我的文件大小通常很小,而且文件数量是总大小的一个很好的指标。

def purge(dir, filepattern):
     files = glob.glob(os.path.join(directory, filepattern))
     files_count=len(files)
     if files_count > THRESHOLD:
         files.sort(key=lambda f: os.path.getatime(f), reverse=True)
         for f in files[TARGET:]:
             os.remove(f)

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 2011-04-17
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2015-08-14
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多