Skip to content

Commit 6ebf6ec

Browse files
Prevent memory allocation when creating new Sketch
1 parent df0ae7f commit 6ebf6ec

File tree

1 file changed

+6
-23
lines changed

1 file changed

+6
-23
lines changed

crates/udd-sketch/src/lib.rs

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,11 @@ impl UDDSketch {
273273
}
274274
}
275275

276-
// This constructor is used to recreate a UddSketch from it's component data
276+
// This constructor is used to recreate a UddSketch from its component data
277277
pub fn new_from_data(
278278
metadata: &UDDSketchMetadata,
279-
keys: impl Iterator<Item = SketchHashKey>,
280-
counts: impl Iterator<Item = u64>,
279+
mut keys: impl Iterator<Item = SketchHashKey>,
280+
mut counts: impl Iterator<Item = u64>,
281281
) -> Self {
282282
let mut sketch = UDDSketch {
283283
buckets: SketchHashMap::with_capacity(metadata.values as usize),
@@ -288,27 +288,10 @@ impl UDDSketch {
288288
num_values: metadata.values,
289289
values_sum: metadata.sum,
290290
};
291-
// TODO
292-
let keys: Vec<_> = keys.collect();
293-
let counts: Vec<_> = counts.collect();
294-
assert_eq!(keys.len(), counts.len());
295-
// assert!(keys.is_sorted());
296-
for i in 0..keys.len() {
297-
sketch
298-
.buckets
299-
.map
300-
.entry(keys[i])
301-
.or_insert(SketchHashEntry {
302-
count: 0,
303-
next: if i == keys.len() - 1 {
304-
SketchHashKey::Invalid
305-
} else {
306-
keys[i + 1]
307-
},
308-
})
309-
.count = counts[i];
291+
292+
while let (Some(key), Some(count)) = (keys.next(), counts.next()) {
293+
sketch.buckets.entry_upsert(key, count);
310294
}
311-
sketch.buckets.head = keys[0];
312295

313296
sketch
314297
}

0 commit comments

Comments
 (0)