用户上传一个由一百万字组成的巨大文件。我解析文件并将文件的每一行放入< code>LinkedHashMap中
我需要按键访问和删除O(1)。此外,我需要保留访问顺序,从任何位置迭代并排序。
内存消耗是巨大的。我启用了字符串
的重复数据删除功能,该功能出现在Java 8中,但事实证明,LinkedHashMap
消耗了大部分内存。
我找到了< code>LinkedHashMap。Entry占用40个字节,但是只有2个指针——一个指向下一个条目,一个指向上一个条目。我以为1个指针应该是64位或者32位。但是,如果我用409,405,320(字节)除以6,823,422(条目数),则每个条目有60个字节。
我想我不需要上一个指针,下一个指针应该足够维持秩序了。为什么< code>LinkedHashMap会消耗这么多内存?如何减少内存消耗?
如何减少内存消耗?
1) 添加 -XX:使用压缩的糟糕
标志到您的 JVM 启动。
2) 实现您自己的LinkedHashMap版本,并根据您的需要进行优化。一、 e.使用primitiveint
作为键而不是Integer,如果不需要,请删除“previous”指针等。注意,除非您希望根据GPLv2许可证发布修改后的哈希映射实现,否则复制OpenJDK源代码可能是不可能的,因为OpenJDK是GPLv2.但是,您可以从Android开源项目复制和修改LinkedHashMap实现,因为它是Apache许可的。
我有一个linkedHashMap,键是一个整数,值是一个对象。相反,我需要最终的哈希映射有一个字符串键。示例: 我有一个枚举,每个int都映射到某个角色。但是,如何将链接哈希映射的键更改为该字符串角色而不是它的整数值?我可以循环访问链接的哈希图来重命名密钥吗?
问题内容: 我不是在谈论String类或哈希码被覆盖的任何其他类。假设如果我只是创建该类的新对象,那么在任何情况下the或true 都将返回该对象的内存地址? 问题答案: 不必要。从文档(重点是我的): 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来 实现 , 但是JavaTM编程语言不需要这种实现技术 。)
问题内容: 我了解到,哈希码是一个唯一标识参考号,它是一个十六进制数。 我的疑问是,参考数字代表对象的内存地址吗? 例如: 这段代码会返回我对象的内存地址吗? 问题答案: 哈希码不是唯一的标识。它只是一个数字,可以帮助您区分对象。两个不同的对象可能具有相同的哈希码,这很好。 HashCode特征: 如果obj1和obj2相等,则它们必须具有相同的哈希码。 如果obj1和obj2具有相同的哈希码,则
问题内容: 在Java中,如果我创建一个并将N个元素放入其中,它将占用多少内存?如果依赖于实现,那么什么才是好的“猜测”? 问题答案: 编辑; 噢,天哪,我是个白痴,我提供了HashMap的信息,而不是HashTable的信息。 但是,检查后,出于内存目的,实现是相同的。 这取决于您的VM的内部内存设置(项目的包装,32位或64位指针以及字对齐/大小),并且不是由Java指定的。 可以在这里找到有
在本节中,我们将了解SHA-256如何应用于在区块链中构建块。在比特币区块链的背景下进行具体讨论,并了解它如何与矿工的角色联系起来。minor 实际上正处于构建块的过程中,这些块添加到区块链中以构建比特币区块链的内容。 在下图中,可以看到此块由块编号,数据字段,与其关联的加密哈希和Nonce组成。 在上图中,生成的散列看起来像:。这个哈希有四个前导零。四个前导零描述块是否有效。出于实际目的,您将看
问题内容: 如何以相反的顺序遍历链接哈希表?地图中是否有预定义的方法可以做到这一点? 我创建它如下: 问题答案: List > list = new ArrayList<>(map.entrySet()); 确实不是很漂亮,但是要花费一个条目集的副本,如果您的地图上有很多条目,则可能会出现问题。 出色的Guava库具有一个,可让您将Java 5用于每个样式循环而不是索引循环: