gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:39 25 4
gpt4 key购买 nike

我是编年史 map 的新手。我正在尝试使用 chronicle-map 对堆外映射进行建模,其中键是原始短数组,值是原始长数组。对于给定的 map ,长数组值的最大大小是已知的。但是,我将有多个此类映射,每个映射的长数组值可能具有不同的最大大小。我的问题与键和值的序列化/反序列化有关。

通过阅读文档,我了解到对于键,我可以使用值类型 ShortValue 并重用该接口(interface)的实现实例。关于值(value),我找到了谈论 DataAccess and SizedReader 的页面它给出了 byte[] 的示例,但我不确定如何将其适应 long[]。我的另一个要求是,我需要在长数组中的任意索引处获取和设置值,而无需支付每次对整个值进行完整序列化/反序列化的成本。

所以我的问题是:如果每个 map 的最大大小已知并且我需要能够读取,我如何在构建 map 时对值类型建模以及 long[] 数组需要什么序列化/反序列化代码并在每次不序列化/反序列化整个值负载的情况下编写随机索引?理想情况下,long[] 将直接在堆外进行编码/解码,而无需进行到 byte[] 的堆内中间转换,并且 chronicle-map 代码不会在运行时分配。谢谢。

最佳答案

首先,我建议使用某种LongList 接口(interface)抽象而不是long[],这样可以更轻松地处理大小可变性,提供替代的享元实现等

如果你只想读/写大列表中的单个元素,你应该使用 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 ...
}
}
}

注意事项:

  1. 您必须从一开始就获取 writeLock(),否则当您调用 context.entry() 方法时,readLock() 将自动获取,并且您以后将无法将读锁升级为写锁。请阅读HashQueryContext javadoc仔细。
  2. Data.bytes()正式返回 RandomDataInput,但您可以确定(它在 Data.bytes() javadoc 中指定)它实际上是 BytesStore 的一个实例(这是 RandomDataInputRandomDataOutput 的组合)。
  3. 假设提供了正确的 SizedReaderSizedWriter(或 DataAccess)。请注意,使用了“字节/元素联合大小”技术,与 SizedReader and SizedWriter doc section 中给出的示例相同, PointListSizeMarshaller .您可以将您的 LongListMarshaller 基于该示例类。
  4. 此类型转换已指定,请参阅 ChecksumEntry javadocthe section about checksums in the doc .如果您有一个纯内存(非持久化)Chronicle Map,或者关闭了校验和,则可以省略此调用。

单元素读取的实现类似。

关于java - 如何使用 Chronicle Map 在随机索引上使用 get/set 序列化/反序列化 long[] 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com