使用 chronicle map 和 byte[] 或 byte buffer

Using chronicle map and byte[] or byte buffer

我正在尝试创建一个 Chronicle 地图,其中包含一个长键和一个可变大小的字节 [],准确地说是一个序列化的 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[=12=](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,但我找不到适用的示例,所以决定在这里提问。

你的测试在我的机器上运行(无错误结束),但打印出意外的输出“0”。那是因为你忘了调用 ts2.flip(),代码应该是这样的:

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

进行此更改后,代码段会打印“10”。

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

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