diff --git a/runtime/src/accounts_index.rs b/runtime/src/accounts_index.rs index ecc040df99..fb9e323317 100644 --- a/runtime/src/accounts_index.rs +++ b/runtime/src/accounts_index.rs @@ -566,19 +566,18 @@ impl<'a, T: 'static + Clone> Iterator for AccountsIndexIterator<'a, T> { return None; } - let chunk: Vec<(Pubkey, AccountMapEntry)> = self - .account_maps - .iter() - .map(|i| { - i.read() - .unwrap() - .range((self.start_bound, self.end_bound)) - .map(|(pubkey, account_map_entry)| (*pubkey, account_map_entry.clone())) - .collect::>() - }) - .flatten() - .take(ITER_BATCH_SIZE) - .collect(); + let mut chunk: Vec<(Pubkey, AccountMapEntry)> = Vec::with_capacity(ITER_BATCH_SIZE); + 'outer: for i in self.account_maps.iter() { + for (pubkey, account_map_entry) in + i.read().unwrap().range((self.start_bound, self.end_bound)) + { + if chunk.len() >= ITER_BATCH_SIZE { + break 'outer; + } + let item = (*pubkey, account_map_entry.clone()); + chunk.push(item); + } + } if chunk.is_empty() { self.is_finished = true;