Skip to content

Commit 53fdfc5

Browse files
committed
add LOAD_SIZE_THRESHOLD
1 parent a99eda5 commit 53fdfc5

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

src/btreemap/node/v1.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,35 @@ impl<K: Storable + Ord + Clone> Node<K> {
6363
max_value_size: u32,
6464
memory: &M,
6565
) -> Self {
66+
const LOAD_SIZE_THRESHOLD: u32 = 8;
6667
// Load the entries.
6768
let mut keys_encoded_values = Vec::with_capacity(header.num_entries as usize);
6869
let mut offset = NodeHeader::size();
70+
let mut buf = vec![];
6971
for _ in 0..header.num_entries {
7072
let key_offset = offset;
71-
offset += U32_SIZE + Bytes::from(max_key_size);
73+
let key_size = read_u32(memory, address + offset);
74+
offset += U32_SIZE;
75+
let key = if key_size <= LOAD_SIZE_THRESHOLD {
76+
read_to_vec(memory, address + offset, &mut buf, key_size as usize);
77+
LazyKey::by_value(K::from_bytes(Cow::Borrowed(&buf)))
78+
} else {
79+
LazyKey::by_ref(key_offset)
80+
};
81+
offset += Bytes::from(max_key_size);
7282

7383
let value_offset = offset;
74-
offset += U32_SIZE + Bytes::from(max_value_size);
84+
let value_size = read_u32(memory, address + offset);
85+
offset += U32_SIZE;
86+
let value = if value_size <= LOAD_SIZE_THRESHOLD {
87+
read_to_vec(memory, address + offset, &mut buf, value_size as usize);
88+
LazyValue::by_value(buf.to_vec())
89+
} else {
90+
LazyValue::by_ref(value_offset)
91+
};
92+
offset += Bytes::from(max_value_size);
7593

76-
keys_encoded_values
77-
.push((LazyKey::by_ref(key_offset), LazyValue::by_ref(value_offset)));
94+
keys_encoded_values.push((key, value));
7895
}
7996

8097
// Load children if this is an internal node.

src/btreemap/node/v2.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,12 @@ impl<K: Storable + Ord + Clone> Node<K> {
146146
}
147147
}
148148

149+
const LOAD_SIZE_THRESHOLD: u32 = 8;
149150
// Load the keys.
150151
let mut keys_encoded_values = Vec::with_capacity(num_entries);
152+
let mut buf = vec![];
151153
for _ in 0..num_entries {
152-
keys_encoded_values.push((
153-
LazyKey::by_ref(Bytes::from(offset.get())),
154-
LazyValue::by_ref(Bytes::from(0usize)),
155-
));
154+
let key_offset = Bytes::from(offset.get());
156155

157156
// Advance offset by the key_size type size if applicable.
158157
let key_size = if K::BOUND.is_fixed_size() {
@@ -165,17 +164,31 @@ impl<K: Storable + Ord + Clone> Node<K> {
165164
offset += U32_SIZE;
166165
key_size
167166
};
167+
let key = if key_size <= LOAD_SIZE_THRESHOLD {
168+
read_to_vec(&reader, offset, &mut buf, key_size as usize);
169+
LazyKey::by_value(K::from_bytes(Cow::Borrowed(&buf)))
170+
} else {
171+
LazyKey::by_ref(key_offset)
172+
};
168173

169174
// Advance offset by the size of the key.
170175
offset += Bytes::from(key_size);
176+
177+
keys_encoded_values.push((key, LazyValue::by_ref(Bytes::from(0usize))));
171178
}
172179

173180
// Load the values
174181
for (_key, value) in keys_encoded_values.iter_mut() {
175-
// Load the values lazily.
176-
*value = LazyValue::by_ref(Bytes::from(offset.get()));
177-
let value_size = read_u32(&reader, offset) as usize;
178-
offset += U32_SIZE + Bytes::from(value_size as u64);
182+
let value_offset = Bytes::from(offset.get());
183+
let value_size = read_u32(&reader, offset);
184+
offset += U32_SIZE;
185+
*value = if value_size <= LOAD_SIZE_THRESHOLD {
186+
read_to_vec(&reader, offset, &mut buf, value_size as usize);
187+
LazyValue::by_value(buf.to_vec())
188+
} else {
189+
LazyValue::by_ref(value_offset)
190+
};
191+
offset += Bytes::from(value_size as u64);
179192
}
180193

181194
Self {

0 commit comments

Comments
 (0)