如何定期清理python

时间:2016-02-01 16:43:10

标签: python file directory purge

我有一个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。达到限制后,我将删除最旧的文件,直到目录大小减少到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

这确实可以完成这项工作,但大部分时间都不需要清除呼叫,因为它只会在一千次通话后达到THRESHOLD。最重要的是,如果文件数量巨大,目录的get_size也可能很耗时。

所以问题是如何优化get_size并将清除逻辑与我当前的虚函数集成?有一个很好的pythonic方式吗?或者我可以使用的模式?感谢

2 个答案:

答案 0 :(得分:0)

您可以使用全局变量来计算函数被调用的次数

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

答案 1 :(得分:0)

我最终使用文件数作为清除指标,并为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)