2013-03-05 56 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或同等工具監視正在寫入的目錄,並像以前一樣將結果保存到數據庫中。只要與讀取相比寫入不頻繁,這將是一個淨贏的工作。實現起來比較困難,但它具有不需要修改寫入代碼的好處。