在 DirectByteBuffer 中存储 Big Hashmap 的方法

Posted

技术标签:

【中文标题】在 DirectByteBuffer 中存储 Big Hashmap 的方法【英文标题】:Way to store a Big Hashmap in DirectByteBuffer 【发布时间】:2013-08-14 06:03:54 【问题描述】:

我想在 DirectByteBuffer 中存储一个哈希映射(最多 1,000,000,000 个条目),我需要在其中读取和写入条目。 hashmap 将有一个字符串键和可序列化的对象。但是,如果将哈希映射作为一个整体序列化并将其存储为 Byte Buffer ,则每次我需要反序列化它都会导致堆内存出现问题。有没有其他方法可以将键值存储在 DirectByteBuffer 中,搜索键并以优化的方式检索值? PS:我需要一个 incache 解决方案,并且我需要从 java 堆中释放对象(这将是我的 hashmap 中的值),因为它们的数量很大。

【问题讨论】:

为什么你试图将它存储在 ByteBuffer 中?请提供更多背景信息。 它的一些元数据应该在应用程序中随时可用。我不能把它放在数据库中。这也应该远离 GC。 好吧,考虑到进入字节缓冲区的内容是只是字节,这不会阻止任何东西被 GC'd。为什么元数据不能通过哈希映射获得? 我提到了 DirectByteBuffer,它将使用物理内存而不是堆内存... 不,我仍然看不出有任何理由在这里使用 DirectByteBuffer。一个简单的法线贴图似乎要简单得多,而且您还没有清楚地解释为什么这对您不起作用。请围绕您认为这是一个问题的原因编辑您的问题(而不仅仅是添加 cmets),也许其他人可以帮助您。 【参考方案1】:

通过使用 DirectByteBuffer,您将使用本机内存。我是否正确假设您走这条路的原因是您不想将 1000000000 存储在堆内存中?如果您担心 java 内存使用情况,您可以设置 JVM 的最大堆大小来处理这个问题吗? (即 -Xmx )?最终结果应该是相同的,您不必担心本机内存。这是一篇讨论此问题的文章http://viralpatel.net/blogs/jvm-java-increase-heap-size-setting-heap-size-jvm-heap/

【讨论】:

这样你就可以把它保存在堆内存中,并作为一个map保存。无需序列化。

以上是关于在 DirectByteBuffer 中存储 Big Hashmap 的方法的主要内容,如果未能解决你的问题,请参考以下文章

JDK 源码阅读 : DirectByteBuffer

DirectByteBuffer实现原理分析

HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer

深入理解DirectByteBuffer

等效于 Java 的 DirectByteBuffer 的 C# 方法

如何将本机内存复制到 DirectByteBuffer