gpt4 book ai didi

java - 内存问题: Storing high volume data in Map

转载 作者:行者123 更新时间:2023-12-02 04:28:09 25 4
gpt4 key购买 nike

我有以下情况:

  1. 来自外部系统的大量消息(消息包含 ID 和负载)
  2. 我根据 ID 过滤这些消息,并将有效负载存储在列表中,最后将 ID 和列表存储在 map 中。
  3. 稍后,我将根据 ID 从 map 中检索有效负载列表,并将整个有效负载列表提交给执行程序服务以供进一步处理。

嗯,我不喜欢这种方法,因为在运行时我有一个包含所有数据的 map (第 2 点)。我可能最终会遇到与内存相关的问题。上述方法是否有任何好的替代方案?

编辑

我正在使用Java。我从某个外部系统获取消息(我不知道可能发送的消息量),最后根据它们的 ID 对其进行处理。处理后,这些内容将存储在数据库中。但是,问题是当我根据 ID 将消息加载到 Map 时。我必须根据 ID 对消息进行分组,然后发送进行处理。所以我必须将整个Map保留在内存中一段时间​​。

提前致谢。

最佳答案

我记得自己用过MapDB为了这。基本上它为您提供了一个 map 界面,但由 off-heap memory 支持。 (想想 Linux 中的内存映射文件)。

您可以在此处找到示例:https://github.com/jankotek/mapdb/blob/master/src/test/java/examples/CacheOffHeap.java

将在此处复制相关部分以便于引用:

        final double cacheSizeInGB = 1.0;

// Create cache backed by off-heap store
// In this case store will use ByteBuffers backed by byte[].
HTreeMap cache = DBMaker
.memoryDirectDB()
.transactionDisable()
.make()
.hashMapCreate("test")
.expireStoreSize(cacheSizeInGB) //TODO not sure this actually works
.make();

//generates random key and values
Random r = new Random();
//used to print store statistics
Store store = Store.forEngine(cache.getEngine());


// insert some stuff in cycle
for(long counter=1; counter<1e8; counter++){
long key = r.nextLong();
byte[] value = new byte[1000];
r.nextBytes(value);

cache.put(key,value);

if(counter%1e5==0){
System.out.printf("Map size: %,d, counter %,d, store size: %,d, store free size: %,d\n",
cache.sizeLong(), counter, store.getCurrSize(), store.getFreeSize());
}

}

// and release memory. Only necessary with `DBMaker.memoryDirect()`
cache.close();

关于java - 内存问题: Storing high volume data in Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879263/

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