浏览代码

Speed up initial repository access

Use os.listdir() instead of os.walk() to avoid unnecessary
stat() calls.

Closes #119
Jonas Borgström 10 年之前
父节点
当前提交
547fa0a590
共有 1 个文件被更改,包括 8 次插入6 次删除
  1. 8 6
      attic/repository.py

+ 8 - 6
attic/repository.py

@@ -408,12 +408,14 @@ class LoggedIO(object):
         self.fds = None  # Just to make sure we're disabled
 
     def segment_iterator(self, reverse=False):
-        for dirpath, dirs, filenames in os.walk(os.path.join(self.path, 'data')):
-            dirs.sort(key=int, reverse=reverse)
-            filenames = sorted((filename for filename in filenames if filename.isdigit()), key=int, reverse=reverse)
-            for filename in filenames:
-                yield int(filename), os.path.join(dirpath, filename)
-
+        data_path = os.path.join(self.path, 'data')
+        dirs = sorted((dir for dir in os.listdir(data_path) if dir.isdigit()), key=int, reverse=reverse)
+        for dir in dirs:
+            filenames = os.listdir(os.path.join(data_path, dir))
+            sorted_filenames = sorted((filename for filename in filenames
+                                       if filename.isdigit()), key=int, reverse=reverse)
+            for filename in sorted_filenames:
+                yield int(filename), os.path.join(data_path, dir, filename)
 
     def get_latest_segment(self):
         for segment, filename in self.segment_iterator(reverse=True):