summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2016-06-12 18:22:47 +0300
committerLars Wirzenius <liw@liw.fi>2016-06-12 18:22:47 +0300
commit31bc38a3b9adebb641cf86913854d676ce525068 (patch)
tree4fc2c2237ae7be482aa2fd1ba722153369d2cdc3
parent284eb4f1d638500fd88b79dd6554b6956e4fcf7a (diff)
downloadobnam-31bc38a3b9adebb641cf86913854d676ce525068.tar.gz
Speed up by only iterating over those that grew last time
-rw-r--r--meliaereader/reader.py15
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()