簡體   English   中英

使用編年史地圖和byte []或字節緩沖區

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM