0

一部の情報をファイルにキャッシュする 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

これは確かに機能しますが、purge の呼び出しはほとんどの場合不要です。これは、1000 回呼び出した後に 1 回しか THRESHOLD に到達しないためです。その上、ファイル数が膨大な場合、ディレクトリの get_size も時間がかかる可能性があります。

問題は、get_size を最適化し、パージ ロジックを現在のダミー関数に統合するにはどうすればよいかということです。それを行うための良いPythonicの方法はありますか? または私が使用できるパターン?ありがとう

4

2 に答える 2

0

最終的にファイル数をパージ メトリックとして使用し、ピュージャー レベルの明示的な目標を設定します。最後にアクセスした時刻でファイルを並べ替え、範囲 [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)
于 2016-03-10T19:04:23.767 に答える