powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / trove4j - не пора ли на свалку.
8 сообщений из 8, страница 1 из 1
trove4j - не пора ли на свалку.
    #39251027
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некий проект, в котором узким местом является работа в set'ом (я сам офигел- но это факт, подтверждённый инструментацией).
Когда-то давно в качестве реализации был выбран THashSet из trove4j.
Сейчас- похоже, что проблемным стало вот что- иногда некоторые set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К. А вставка в сет идёт достаточно хитрым путём - gnu.trove.impl.hash.TObjectHash#insertKeyRehash

Смотрю на trove4j - он не обновляется с 2012го года. А JDK за это время как раз хорошо оптимизировали.
Как кто считает- стоит ли попробовать перести на стандартный HashSet? Там, конечно, внутри тот ещё оверинжиниринг (Map'ы)...
Или может гугл что хорошее написал?

--<br /> Алексей.<br />
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251145
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А написать синтетический тест для случая "set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К" ? Все же IMHO, паттерн использования весьма специфический.

Посмотрел на исходники, они зачем то ищут именно до free slots, параллельно просматривая removed. Если понимать, что делаешь, вполне можно создать свой класс и переопределить protected int insertKey(T key). Но тут я не советчик, знания об алгоритмах у меня не достаточно хорошее, что бы понять, почему у них именно такая реализация. IMHO
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251227
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА написать синтетический тест для случая "set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К" ? Все же IMHO, паттерн использования весьма специфический.

Посмотрел на исходники, они зачем то ищут именно до free slots, параллельно просматривая removed. Если понимать, что делаешь, вполне можно создать свой класс и переопределить protected int insertKey(T key). Но тут я не советчик, знания об алгоритмах у меня не достаточно хорошее, что бы понять, почему у них именно такая реализация. IMHO

Ага. Более того- это set WeakReference. Т.е. мысль- либо уйти на WeakHashMap, либо , действительно, переписать insertKey, который будет считать "опустевшие" ссылки пустыми. Думаю пока, пробую.
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251331
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Само по себе вырастание до 6М - не при чем. Это зависит не от реализации сета, а от кол-ва данных, которые вы туда засовываете и от load factor-а. Много данных - большой размер Set'а. От реализации, конечно, тоже зависит, но на JDK-шной данных можно ждать больше в несколько раз (зависит еще от типа элементов).

Судить о узком месте надо не по размеру данных внутри сета, а о том, как часто возникают коллизии, как часто происходит перехеширование всего. Или какие-то другие показатели.
Если 6М выглядит многоватым - то это очевино, не сет виноват. Ему-то что? Сколько в него положили - все его. Это либо что-то не то со всем алгоритмом (например, подозрительно много данных генерит), или вы неверно оценили объем данных, с которыми работаете.
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251358
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там в исходном коде, проверка для выхода из цикла НЕ на любой свободный элемент в set'е ("free slots", "removed"), а именно на "free slots".

Т.ч. если сет сначала разросся, а потом сжался и 99.99% элементов стало "removed", то наверное может быть замедление. Но почему так сделано - не понятно. Наверное были свои причины. Разбираться желания нет. Пусть автор топика разбирается )))
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251405
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin, надо смотреть в корень. А имеено - зачем здесь был THashSet ?

Про саму библиотеку trove пишут что она использует примитивы вместо врапперов.

http://trove.starlight-systems.com/

Возможно люди, которые ее заюзали преследовали какие-то задачи оптимизации memory e.t.c.

Попробовать перевести - можно. Ну ... там тестов поболее чтоб покрыть.
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251466
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...она использует примитивы вместо врапперов....
Я сейчас юзаю http://fastutil.di.unimi.it/

Как она будет вести себя в ситуации описанной топик стартером - не знаю. Все же, у него паттерн достаточно редкий. Лично у меня данные просто сначала добавляются, потом используются. Переиспользование коллекций достаточно редко происходит (да и то, только в том случае, если они 100% совпадают по размеру, если отличаются - грохаю и создаю новые).
...
Рейтинг: 0 / 0
trove4j - не пора ли на свалку.
    #39251479
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТам в исходном коде, проверка для выхода из цикла НЕ на любой свободный элемент в set'е ("free slots", "removed"), а именно на "free slots".

Т.ч. если сет сначала разросся, а потом сжался и 99.99% элементов стало "removed", то наверное может быть замедление. Но почему так сделано - не понятно. Наверное были свои причины. Разбираться желания нет. Пусть автор топика разбирается )))

Разобрался.
Там несложно.
Когда мы вставляем элемент V1, потом V2 с хэшсетов, приводящим первоначально в тот же элемент (совпал hash % _set.length) - то элемент будет вставлен по индексу +probe.
Если мы после этого удалим V1, а потом вставим ещё раз V2, то мы сразу наткнёмся на REMOVED элемент.
Если мы вставим его сразу- то V2 будет в set'е дважды.
Поэтому надо запомнить позицию, но добрести до FREE элемента (либо до equals).

Фигня в том, что при частой удалении/вставке мы бродим по set'у в поисках свободного угла ОЧЕНЬ долго.
Авторы кода, который я оптимизирую, решили съэкономить память (не использовав WeakHashMap) и, как результат, теперь это создаёт проблемы производительности.

Правда истинная причина совершенно в другом месте, но тот код я пока не в состоянии исправить- приходится костылять
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / trove4j - не пора ли на свалку.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]