- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不久前,我问过this question关于 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 个 block 。
所以我的问题是:解决这个问题的最佳方法是什么?我正在考虑但仍不确定的一些方法:
ChronicleMapBuilder.maxChunksPerEntry
或ChronicleMapBuilder.actualChunkSize
。也就是说,我如何确定性地弄清楚这些应该设置成什么?另外,如果设置得太高,可能会导致大量碎片和性能下降,对吗?XYZ
产生 Set<Integer>
大小为 10000,也许我可以将其分成 5 个键 XYZ:1
, XYZ:2
等等,每个都有一组大小为 2000 的集合。这感觉就像是对我可以在 ChronicleMap 中配置的东西进行了黑客攻击,并导致大量代码感觉好像没有必要。我在其他问题中也提到了同样的计划。其他想法/想法表示赞赏!
最佳答案
如果您不指定maxChunksPerEntry()
手动时,条目的最大大小受到段层大小的限制(以 block 为单位)。因此,您需要的是增大段层的大小。您可以尝试做的第一件事是配置 actualSegments(1)
,如果您不打算同时从 JVM 中的多个线程访问映射。您可以通过 ChronicleMapBuilder.actualChunkSize()
对这些配置进行额外控制, actualChunksPerSegmentTier()
和 entriesPerSegment()
.
默认情况下 ChronicleMapBuilder 选择配置平均值大小的 1/8 到 1/4 之间的 block 大小。因此,如果您的段层大小为 6328 个 block ,则您的段配置为包含大约 1000 个条目。如果您的平均值集大小有 400 个元素,最大值为 20,000,则平均值和最大值之间的差异应约为 50 倍,但从堆栈跟踪来看,您的其中一个条目比平均值大 2000 倍以上。可能你还没有考虑到一些事情。
对于这么大的值,我建议开发和使用内存效率更高的值序列化器,因为默认的序列化器会生成大量垃圾。例如它可以使用原语 IntSet
它实现了 Set<Integer>
来自 fastutil 或 Koloboke 或 Koloboke 编译库。
另外我建议使用现在可用的最新版本,Chronicle Map 3.9.1 已经过时了。
关于java - 填充值大小变化较大的 ChronicleMap 时出现 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129923/
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
我希望你能找到我的文字,因为我真的对我的项目感到困惑,因为应用程序不能安装在模拟器中。我希望你的建议和指导。这是运行应用程序时的日志记录。RegisterViewModel.kt。密封的类资源.kt。
我正在尝试制作按钮,单击它们时会播放声音。但我有一个麻烦。我实在搞不清楚。这是我的代码: import javafx.application.Application; import javafx.ev
我正在查看一些遗留代码,发现一个部分导致我得到“比较方法违反了其一般契约!”错误。我知道这个错误是代码不具有传递性的结果,但我不完全理解如何正确修复它。 这是导致错误的代码。 private void
运行以下方法时,我不断收到 IllegalArgumentException: public int randomize(ArrayList list){ Random rdm = new R
我想给 Jenkins 添加一个新的 slave。当我遵循 Jenkins UI 时,它给了我下面的命令 java -jar agent.jar -jnlpUrl http:///computer//
我正在使用运行时反射来加载一个包含以下两个方法的类: public static void foo(int[] args) { System.out.print("foo invoked: "
我已经使用以下查询来匹配所有文档 { "query": { "custom_score": { "query": { "query_string": {
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我收到以下运行时错误: checkParameterIsNotNull, parameter oneClickTokens at com.info.app.fragments.Fragmen
我有两个列表: (def xxa ["olp" "xyz"]) (def xxb ["ulove" "alove" "holp" "sholp"]) 还有一个函数尝试获取第一个列表的元素,这些元素是第
在我的代码中,我在向服务器执行请求的行中捕获了 IllegalArgumentException(索引 85 处查询中的非法字符)。使用 was build as patter 命令,另一个任务正确完
我试图将 String[] 放入 jsonObject 并收到以下错误 java.lang.IllegalArgumentException: Invalid type of value. Type:
我过去的一个试卷问题要求我修改一个方法,以导致发生 IllegalArgumentException。 该方法仅涉及从银行帐户余额中提取资金 这是执行此操作的方法。 公共(public)无效提款(双倍
我这里遇到了一点问题。我想弄清楚如何捕获 IllegalArgumentException。对于我的程序,如果用户输入负整数,程序应该捕获 IllegalArgumentException 并询问用户
每当插件尝试运行此延迟的任务时,我都会收到“ IllegalArgumentException:插件不能为空”错误: Bukkit.getServer().getScheduler().sched
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我在更改应用程序中的场景时遇到问题,看起来像 Main screen > Login screen 我在主文件中将屏幕存储为 hashmap一切都很好,直到我从登录屏幕返回到主屏幕并想再次加载登录屏幕
我在这里缺少什么? 我得到异常:java.lang.IllegalArgumentException:对象不是声明类的实例 public boolean onSave(Object entity,Se
我是一名优秀的程序员,十分优秀!