2013-03-14 2 views
0

ИТАК я reformated пост, чтобы сделать его немного легче понять (жаль всех pastebins, но переполнение стека был быть немым с кодом форматирования)Set <> = Sets.newHashSet()

Пожалуйста, обратите внимание, что я не намеревайтесь иметь смехотворный объем данных, хранящихся, как я заявляю ниже. Основная причина, по которой я использую сумму, которую я сказал, - выжать как можно большую эффективность.

Допустим, у меня есть следующий код (ы)

метод, который будет добавлять к DropItemQueue (начинается в заливка (с глубиной 0) другие PARAMATERS не имеет значения)

http://pastebin.com/3wqEb5cM

это тот же класс, и это будет вызывать метод dropItem в Utils

http://pastebin.com/yEUW9Wad

Мой метод Utils.dropItem выглядит следующим образом

http://pastebin.com/c0eaWeMA

Это метод ServerTickHandler.addDropItemQueue и его хранения переменных

http://pastebin.com/Q4p5a4ja

Вот класс DropItemQueue

http://pastebin.com/wxCj9imN

Если бы я был говорит, что добавить 100000000 элементов к этому HashSet я заметил, что она занимает около 2 секунд, чтобы

перебрать все в HashSet с помощью Этого итератора называется каждые 1/двадцатым из seccond

http://pastebin.com/zSWg1kKu

- секунд на итерацию не кажется много, но с таким количеством элементов, чтобы избавиться от каждого элемента, сохраненного в хэш-наборе, потребуется около 50 дней

каждый раз, когда элемент анализируется на хэшсет, maxTicks равен 1 больше, чем предыдущий добавленный el так что в основном каждые 1 секунду предмет отбрасывается, но из-за 2 секунд, чтобы перебрать все, что на самом деле занимает 3 секунды, чтобы отбросить элемент, который заставит его заняться около 150 дней, чтобы завершить итерацию и вымыть каждый элемент и завершить

мой вопрос: было бы проще иметь несколько наборов хэшей с меньшими максимальными элементами, скажем, 1000 элементов.

Да, это дало бы мне 100000 хешетах, но из-за их меньшего количества итераций время было бы медленнее (все это было бы очень небольшое повышение эффективности), или есть что-то лучшее, что я могу использовать, кроме хешета, или есть хэшеты лучше всего использовать?

не отметить, что, если я использовал несколько итераций меньших итераций я не мог использовать потоки из-за избыточности данных кросса потоков

+0

Ваш поток программ по-прежнему неясен из того, что вы опубликовали. Можете ли вы включить более полную выборку? –

+2

У вас действительно есть хеш-набор с 100 миллионами элементов в нем? Не удивительно, что для удаления элемента требуется некоторое время, но 2 секунды кажется ужасным. Возможно, ваша программа избивается из-за низкой физической памяти? Вы пробовали профилировать, чтобы узнать, куда идет время? Кроме того, поскольку элементы удаляются, процесс должен значительно ускориться, поэтому вы не можете оценить общее время от одного итерационного времени наихудшего случая. –

+0

@TedHopp В реальных ситуациях у него не будет 100 миллионов элементов, но главная причина этого вопроса - повысить эффективность для больших сумм. malcom дать мне минуту и ​​плохо реструктурировать, как работает код –

ответ

1

Структура HashSet данных предназначена для действительно только для одной цели, которая должна ответить на вопрос " Этот набор содержит этот элемент ».Для любого другого использования это не обязательно самое эффективное.

Для вашего использования кажется, что очередность будет лучшим выбором.

+0

Почему очередь должна быть лучше? Кажется, что OP не заинтересован в поддержании порядка между элементами, а итератор с такой же эффективностью, как итератор очереди. Во всяком случае, удаление элементов из очереди будет медленнее, чем из HashSet (в зависимости от используемой структуры очереди). –

+0

Я предложил Очередь с головы, но список тоже сработает. Основная причина, по которой мне не нравится HashSet, заключается в том, что элементы, вероятно, не смежно хранятся (поскольку они индексируются по хешу), поэтому создание итератора будет медленнее, чем сказать что-то вроде связанного списка (или очереди). –

+0

Я не очень беспокоился, если он отсортирован или нет. –

Смежные вопросы