问题描述
我有以下情况:
- 来自外部系统的大量消息列表(消息包含id和有效负载)
- 我正在基于id过滤这些消息,并将有效负载存储在列表中,最后将id和List存储在映射中。
- 稍后基于id,我将从map检索有效负载列表,并将整个有效负载列表提交给执行程序服务以进行进一步处理。
好吧,我不喜欢这种方法,因为在运行时我有一个包含所有数据的映射(第2点)。 我可能会遇到与内存有关的问题。 上述方法是否有任何好的替代方法?
编辑
我正在使用Java。 我正在从某个外部系统获取消息(我不知道可能出现的消息量),最后根据其ID处理它们。 处理后,这些将被存储在数据库中。 但是,问题是在我根据ID将消息加载到Map时。 我必须根据ID对消息进行分组,然后进行处理。 因此,我必须将整个地图保留在内存中一段时间??。
提前致谢。
1楼
我记得为此使用自己的 。 基本上,它为您提供了Map界面,但是由 (在Linux中考虑内存映射文件)进行备份。
您可以在此处找到示例: :
将在此处复制相关部分,以方便参考:
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();