Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存问题:在地图中存储大量数据_Java_List_Dictionary - Fatal编程技术网

Java 内存问题:在地图中存储大量数据

Java 内存问题:在地图中存储大量数据,java,list,dictionary,Java,List,Dictionary,我有以下情况: 来自外部系统的大量消息列表(消息包含id和有效负载) 我根据id过滤这些消息,并将有效负载存储在列表中,最后将id和列表存储在地图中 稍后,我将根据id从map检索有效负载列表,并将整个有效负载列表提交给执行器服务进行进一步处理 我不喜欢这种方法,因为在运行时我有一个包含所有数据的映射(第2点)。我可能最终会遇到与记忆有关的问题。上述方法有什么好的替代方法吗 编辑 我正在使用Java。我从一些外部系统获取消息(我不知道可能会收到多少消息),最后根据它们的ID对它们进行处理。处理后

我有以下情况:

  • 来自外部系统的大量消息列表(消息包含id和有效负载)
  • 我根据id过滤这些消息,并将有效负载存储在列表中,最后将id和列表存储在地图中
  • 稍后,我将根据id从map检索有效负载列表,并将整个有效负载列表提交给执行器服务进行进一步处理
  • 我不喜欢这种方法,因为在运行时我有一个包含所有数据的映射(第2点)。我可能最终会遇到与记忆有关的问题。上述方法有什么好的替代方法吗

    编辑

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

    提前谢谢。

    我记得为此我用了我自己。 基本上,它为您提供了一个映射接口,但由(想想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();
    
    final-double-cacheSizeInGB=1.0;
    //创建由堆外存储支持的缓存
    //在这种情况下,存储将使用字节[]支持的ByteBuffers。
    HTreeMap cache=DBMaker
    .memoryDirectDB()文件
    .transactionDisable()
    .make()
    .hashMapCreate(“测试”)
    .expireStoreSize(cacheSizeInGB)//t不确定这是否真的有效
    .make();
    //生成随机键和值
    随机r=新随机();
    //用于打印存储统计信息
    Store Store=Store.forEngine(cache.getEngine());
    //在循环中插入一些东西
    
    (长计数器=1;将消息存储在数据库中)(选择毒药:关系式或NoSQL)…或购买昂贵的产品(例如赤陶土大内存)和大量RAM(1TB现在便宜):数据有多大?您是否考虑使用HaselCask或CasdRRA等缓存工具?