当前位置: 代码迷 >> java >> 内存问题:在地图中存储大量数据
  详细解决方案

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

热度:46   发布时间:2023-07-25 19:32:22.0

我有以下情况:

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

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

编辑

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

提前致谢。

我记得为此使用自己的 。 基本上,它为您提供了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();
  相关解决方案