Некоторое время назад я спросил этот вопрос об использовании ChronicleMap в качестве Map<String,Set<Integer>>
. По сути, у нас есть коллекция, в которой среднее значение Set<Integer>
может быть равно 400, а максимальная длина — 20 000. В ChronicleMap 2 это приводило к довольно серьезному сбою JVM. Я перешел на ChronicleMap 3.9.1 и теперь начал получать исключение (по крайней мере, это не сбой JVM):
java.lang.IllegalArgumentException: Entry is too large: requires 23045 chucks, 6328 is maximum.
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.allocReturnCode(CompiledMapQueryContext.java:1760)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.allocReturnCodeGuarded(CompiledMapQueryContext.java:120)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.alloc(CompiledMapQueryContext.java:3006)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.initEntryAndKey(CompiledMapQueryContext.java:3436)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.putEntry(CompiledMapQueryContext.java:3891)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.doInsert(CompiledMapQueryContext.java:4080)
at net.openhft.chronicle.map.MapEntryOperations.insert(MapEntryOperations.java:156)
at net.openhft.chronicle.map.impl.CompiledMapQueryContext.insert(CompiledMapQueryContext.java:4051)
at net.openhft.chronicle.map.MapMethods.put(MapMethods.java:88)
at net.openhft.chronicle.map.VanillaChronicleMap.put(VanillaChronicleMap.java:552)
Я подозреваю, что это все еще потому, что у меня есть значения, которые сильно отличаются от среднего. Я предполагаю, что ChronicleMap определил максимальное количество чанков как 6328 на основе среднего значения, которое я дал билдеру, но не ожидал, что будет гигантское значение, для которого нужно 23045 чанков.
Итак, мой вопрос: как лучше всего решить эту проблему? Некоторые подходы, которые я рассматриваю, но все еще не уверен:
- Используйте
ChronicleMapBuilder.maxChunksPerEntry
илиChronicleMapBuilder.actualChunkSize
. Тем не менее, как мне детерминистически выяснить, на что они должны быть установлены? Кроме того, это, вероятно, приведет к большой фрагментации и снижению производительности, если установить слишком высокое значение, верно? - Имейте «максимальный размер коллекции» и разделите очень большие коллекции на множество меньших, установив соответствующий ключ. Например, если мой ключ
XYZ
, который даетSet<Integer>
размера 10000, возможно, я мог бы разделить его на 5 ключейXYZ:1
,XYZ:2
и т. д. каждый с набором размера 2000. Это похоже на взлом чего-то, что я мог бы просто настроить в Однако ChronicleMap приводит к большому количеству кода, который кажется ненужным. У меня был этот же план, упомянутый и в моем другом вопросе.
Другие мысли/идеи приветствуются!
entries()
? - person leventov   schedule 14.12.2016Map<String,Set<Integer>>
в памяти.entries()
устанавливается в зависимости от размера карты; Я вычисляю средний вход по среднему размеру сетов (ну я используюaverageValue()
с сетом, ближайшим к среднему размеру, но выше). - person Depressio   schedule 14.12.2016