2013-03-05 79 views
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秒来查找目前包含大量文件的目录的大小。难道有人会告诉我一些有效的功能来做同样的事情,以便找到更小的尺寸吗?高效的python函数查找目录的大小

回答

2

问题不在于数据的大小,而在于包含它的(大概很小的)文件的数量。我没有看到明显优化您的方法的方法 - 像du这样的系统实用程序使用相同的方法计算大小。不过,这里有几点建议,通过增加难度和有效性下令:

  • 对于一个小的加速,你可以从使用的文件和目录区分同一os.stat调用获取文件的大小推出自己的os.walk变种。由于系统调用的数量减少,这可能会让你买一秒。

  • 您可以在Python/C或Cython中编写getSize以避免在检查大量文件和目录时解释器开销。充其量只需几秒钟。

  • 更改该写入的数据也保持总大小,或者在一个单一的数据库中的文件大小索引码(源码认为),其本身可以被索引。这将使大小查找瞬间。

  • 使用inotify或同等工具监视正在写入的目录,并像以前一样将结果保存到数据库中。只要与读取相比写入不频繁,这将是一个净赢的工作。实现起来比较困难,但它具有不需要修改写入代码的好处。