3
def getSize(path):
    start_time = time.time()
    totalSize = 0
    if os.path.isdir(path):

        for dirpath, dirnames, filenames in os.walk(path):
            for fName in filenames:
                fp = os.path.join(dirpath, fName)
                totalSize += os.path.getsize(fp)
        print time.time() - start_time, "seconds"
        return totalSize

    else:
        return os.path.getsize(path)

上記の関数は、現在多くのファイルを含むディレクトリのサイズを見つけるのに約 25 秒かかります。サイズを見つける時間が短くなるように、同じことを行うための効率的な関数を教えてもらえますか?

4

1 に答える 1

2

問題はデータのサイズではなく、それを含む (おそらく小さい) ファイルの数にあります。あなたのアプローチを大幅に最適化する方法はわかりません —du同じアプローチを使用してサイズを計算するようなシステムユーティリティ。それにもかかわらず、ここにいくつかの提案があります。

  • 少しスピードアップするために、ファイルとディレクトリを区別するために使用されるos.walkのと同じ呼び出しからファイル サイズを取得する独自のバリアントをロールバックできます。os.statsyscall の数が減るので、これで少しは稼げるかもしれません。

  • Python/C または Cython でコーディングgetSizeして、膨大な数のファイルとディレクトリを検査する際のインタープリターのオーバーヘッドを回避できます。これには、せいぜいあと数秒かかるかもしれません。

  • データを書き込むコードを変更して、合計サイズ、またはインデックスを作成できる単一のデータベース (sqlite を考えてください) 内のファイル サイズ インデックスも維持します。これにより、サイズのルックアップが瞬時に行われます。

  • または同等のものを使用して書き込まれているディレクトリを監視し、inotify以前と同様に結果をデータベースに保存します。これは、読み取りに比べて書き込みの頻度が低い限り、実質的に有利な作業になります。実装は難しくなりますが、記述を行うコードを変更する必要がないという利点があります。

于 2013-03-05T08:01:01.333 に答える