diff options
author | Lars Wirzenius <liw@liw.fi> | 2016-06-12 18:22:47 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2016-06-12 18:22:47 +0300 |
commit | 31bc38a3b9adebb641cf86913854d676ce525068 (patch) | |
tree | 4fc2c2237ae7be482aa2fd1ba722153369d2cdc3 | |
parent | 284eb4f1d638500fd88b79dd6554b6956e4fcf7a (diff) | |
download | obnam-31bc38a3b9adebb641cf86913854d676ce525068.tar.gz |
Speed up by only iterating over those that grew last time
-rw-r--r-- | meliaereader/reader.py | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/meliaereader/reader.py b/meliaereader/reader.py index 0ced862c..9794e16a 100644 --- a/meliaereader/reader.py +++ b/meliaereader/reader.py @@ -76,15 +76,20 @@ class MeliaeReader(object): # Find new objects that can be reached from current closures. # Repeat until no more. added = True + growing_refs = list(all_refs) while added: + sys.stderr.write('.') + sys.stderr.flush() added = False - for ref in all_refs: - added = self.add_to_closure(ref) or added + growing2 = set() + for ref in growing_refs: + growing2.update(self.add_to_closure(ref)) + growing_refs = growing2 assert set(self._objs.keys()) == set(self._closures.keys()) def add_to_closure(self, ref): - added = False + grown = set() closure = self._closures[ref] children = [self.get_object(r) for r in closure] for child in children: @@ -93,8 +98,8 @@ class MeliaeReader(object): for r in delta: if r in self: closure.add(r) - added = True - return added + grown.add(child['address']) + return grown def _simple_get_closure(self, ref): # pragma: no cover closure = set() |