使用编年史映射和byte []或字节缓冲区

时间:2017-04-04 06:25:59

标签: java bytebuffer chronicle-map

我正在尝试创建一个Chronicle地图,其中包含一个Long键和一个可变大小的byte [],这是一个精确的序列化Java BitSet。我可以使用Values接口创建一个映射,但其中的数组大小是固定的。

所以,我希望使用byte []或Bytebuffer,因为它们是动态大小的,因此节省了内存。这是一个受支持的用例吗?是否有使用带有byte []或ByteBuffer值类的chronicle map的示例?以下代码失败

ChronicleMap<Long, ByteBuffer> map = ChronicleMap
    .of(Long.class, ByteBuffer.class)
    .name("shard_map")
    .averageValueSize(1000)
    .entries(1_000_000)
    .create();

ByteBuffer ts2 = ByteBuffer.allocateDirect(10);
ts2.putInt(10);
map.put(1L, ts2);
System.out.println(map.get(1L).getInt());

错误:

Exception in thread "main" java.nio.BufferUnderflowException
    at java.nio.Buffer.nextGetIndex(Buffer.java:506)
    at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:361)

我尝试使用Values.newHeapInstance创建值对象,但失败并显示错误:

Exception in thread "main" java.lang.IllegalArgumentException: class java.nio.ByteBuffer is not an interface nor a generated class native or heap class
    at net.openhft.chronicle.values.ValueModel.notValueInterfaceOfImpl(ValueModel.java:68)
    at net.openhft.chronicle.values.ValueModel.lambda$acquire$0(ValueModel.java:64)
    at net.openhft.chronicle.values.ValueModel.doSomethingForInterfaceOr(ValueModel.java:85)
    at net.openhft.chronicle.values.ValueModel.acquire(ValueModel.java:63)
    at net.openhft.chronicle.values.Values.heapClassFor(Values.java:68)
    at net.openhft.chronicle.values.Values.newHeapInstance(Values.java:37)

文档说开箱即用支持byte []和ByteBuffer,但我找不到一个有效的例子,所以决定在这里问。

1 个答案:

答案 0 :(得分:0)

您的测试在我的机器上运行(结束且没有错误),但打印出意外的输出&#34; 0&#34;。那是因为您忘记拨打ts2.flip(),代码应如下所示:

ts2.putInt(10);
ts2.flip();
map.put(1L, ts2);

通过此更改,代码段会打印&#34; 10&#34;。

开箱即用,Chronicle Map将ByteBuffer的内容序列化为ByteBuffer的位置和限制。您可以在自定义序列化程序中覆盖它,并编写整个缓冲区。

顺便说一句,在你的情况下,我不建议使用小型直接缓冲区来将值放入Chronicle Map(ts2)。为此使用普通的堆缓冲区。