Проблемы с производительностью при копировании между наборами Koloboke
Из -за способа выполнения итерации и добавления новых записей, если один перебирает один набор и копирует в другой набор, производительность очень низкая. Рассмотрим следующий фрагмент кода:
final int num = (int) (1024 * 1024 * 2.1);
final HashLongSet set1 = HashLongSets.newMutableSet();
for (int i = 0; i < num; i++) {
final long oid = r.nextLong();
set1.add(oid);
}
System.out.println("populated first set..");
final HashLongSet set2 = HashLongSets.newMutableSet();
final LongCursor cursor = set1.cursor();
while (cursor.moveNext()) {
set2.add(cursor.elem());
}
System.out.println("populated first set..");
Есть ли способ ускорить заселение второго сета в этом случае? Я понимаю, что, если бы я знал ожидаемый размер набора заранее, я мог бы использовать его при построении второго набора и сделать вещи быстрее - но это не всегда возможно - я мог бы вставить некоторые условия между ними, чтобы определить, какой выходной набор необходим для значения. быть вставленным или выброшенным полностью.
1 ответ
Это быстрее, если вы создадите второй HashLongSet, используя первый набор в качестве параметра в методе создания:
final HashLongSet set2 = HashLongSets.newMutableSet(set1);
ОБНОВИТЬ
В зависимости от вашего комментария, что делать, если вы делаете что-то вроде:
- Создайте столько HashLongSets, сколько вам нужно (
countSets
) с начальной емкостью(int) set1.size() / countSets
- Затем запустите ваш цикл для разделения ваших данных набора 1 на другие наборы. В каждом цикле вы должны проверить, достигнут ли initialCapacity, и расширить соответствующий HashLongSet другим
initialCapacity
:set2.ensureCapacity(set2.size() + initialCapacity
)