[英]Using chronicle map and byte[] or byte buffer
我正在嘗試使用長鍵和可變大小的byte [](准確地說是序列化的Java BitSet)創建Chronicle映射。 我可以使用Values接口創建一個映射,但是其中的數組大小是固定的。
因此,由於它們具有動態大小,因此我希望使用byte []或Bytebuffer,從而節省了內存。 這是受支持的用例嗎? 有沒有使用帶有byte []或ByteBuffer值類的歷史記錄映射的示例? 以下代碼失敗
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,但是我找不到適用的示例,因此決定在此處詢問。
您的測試可在我的機器上運行(結束無錯誤),但輸出意外的輸出“ 0”。 這是因為您忘記了調用ts2.flip()
,代碼應如下所示:
ts2.putInt(10);
ts2.flip();
map.put(1L, ts2);
進行此更改后,代碼段將打印“ 10”。
Chronicle Map開箱即用,在ByteBuffer的位置和限制之間序列化ByteBuffer的內容。 您可以在自定義序列化程序中覆蓋它,然后寫入整個緩沖區。
順便說一句,在您的情況下,我建議您不要使用小型直接緩沖區,而只是將一個值放入Chronicle Map(ts2)中。 為此使用普通的堆緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.