ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何使用Chronicle Map在随机索引上使用get / set序列化/反序列化long []值?

2019-05-22 17:48:00  阅读:290  来源: 互联网

标签:java low-latency chronicle chronicle-map off-heap


我是编年史的新手.我正在尝试使用chronicle-map对离堆映射进行建模,其中键是原始short,值是原始长数组.对于给定的映射,长数组值的最大大小是已知的.但是我将有多个这种类型的映射,每个映射对于长数组值可能具有不同的最大大小.我的问题涉及密钥和值的序列化/反序列化.

从阅读文档我明白,对于密钥,我可以使用值类型ShortValue并重用该接口的实现实例.关于值我发现页面正在讨论DataAccess and SizedReader,它给出了byte []的一个例子,但我不确定如何将它改编为long [].一个额外的要求,我是,我需要获取和设置在长数组中任意索引值,而无需支付每次整个价值的全系列化/ deserialisation的成本.

所以我的问题是:我怎么能构建地图和序列化的/ deserialisation代码,我需要很长一段[]数组,如果最大尺寸是每个地图时才知道模型中的价值类型,我需要能够读取和写入随机每次没有序列化/反序列化整个值有效负载的索引?理想地,长[]将被编码/解码的直接向/从关堆而不对堆中间转换经历一个为一个字节[]和也是纪事地图代码在运行时不会分配.谢谢.

解决方法:

首先,我建议使用某种LongList接口抽象而不是long [],这样可以更容易地处理大小变化,提供替代的flyweight实现等.

如果您只想读/写大型列表中的单个元素,则应使用advanced contexts API

/** This method is entirely garbage-free, deserialization-free, and thread-safe. */
void putOneValue(ChronicleMap<ShortValue, LongList> map, ShortValue key, int index,
        long element) {
    if (index < 0) throw throw new IndexOutOfBoundsException(...);
    try (ExternalMapQueryContext<ShortValue, LongList, ?> c = map.getContext(key)) {
        c.writeLock().lock(); // (1)
        MapEntry<ShortValue, LongList> entry = c.entry();
        if (entry != null) {
            Data<LongList> value = entry.value();
            BytesStore valueBytes = (BytesStore) value.bytes(); // (2)
            long valueBytesOffset = value.offset();
            long valueBytesSize = value.size();
            int valueListSize = (int) (valueBytesSize / Long.BYTES); // (3)
            if (index >= valueListSize) throw new IndexOutOfBoundsException(...);
            valueBytes.writeLong(valueBytesOffset + ((long) index) * Long.BYTES,
                element);
            ((ChecksumEntry) entry).updateChecksum(); // (4)
        } else {
            // there is no entry for the given key
            throw ...
        }
    }
}

笔记:

>您必须从头开始获取writeLock(),因为否则当您调用context.entry()方法时将自动获取readLock(),并且您将无法在以后将读锁升级为写锁.请仔细阅读HashQueryContext javadoc.
> Data.bytes()正式返回RandomDataInput,但您可以肯定(它在Data.bytes()javadoc中指定)它实际上是BytesStore的实例(即RandomDataInput和RandomDataOutput的组合).
>假设提供了正确的SizedReader和SizedWriter(或DataAccess).请注意,使用“bytes / element joint size”技术,与SizedReader and SizedWriter doc section,PointListSizeMarshaller中给出的示例相同.您可以将LongListMarshaller作为该示例类的基础.
>已指定此强制转换,请参阅ChecksumEntry javadocthe section about checksums in the doc.如果您有纯粹的内存(非持久性)Chronicle Map或关闭校验和,则可以省略此调用.

单元素读取的实现类似.

标签:java,low-latency,chronicle,chronicle-map,off-heap
来源: https://codeday.me/bug/20190522/1153245.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有