gpt4 book ai didi

java - 如果我需要的内存多于 Java 堆中的内存,我该怎么办?

转载 作者:行者123 更新时间:2023-11-30 01:53:42 25 4
gpt4 key购买 nike

我有一个图形算法,可以生成与不同节点关联的中间结果。目前,我已经通过使用 ConcurrentHashMap<Node, List<Result> 解决了这个问题(我正在运行多线程)。所以首先我添加新结果 map.get(node).add(result)然后我使用 map.get(node) 一次消耗节点的所有结果.

但是,我需要在一个相当大的图表上运行,其中中间结果的数量不适合内存(很好的旧OutOfMemory异常(exception))。因此,我需要一些解决方案来将结果写到磁盘上,因为那里仍然有空间。

在查看了许多不同的“堆外”映射和缓存以及 MapDB 后,我认为它们都不适合我。它们似乎都不支持多重映射(我想你可以称之为我的映射)或可变值(列表就是)。此外,当我尝试为每个节点创建新集合时,MapDB 对我来说非常慢(即使使用基于 FST 的自定义序列化器)。

不过,我几乎无法想象我是第一个也是唯一一个遇到这样问题的人。我所需要的只是从键到列表的映射,我只需要扩展或整体读取该列表。优雅而简单的解决方案会是什么样子?或者是否有任何现有的库可供我使用?

预先感谢您节省了我的一周时间:)。

编辑
我已经看到了很多好的答案,但是,我有两个重要的限制:我不想依赖外部数据库(例如 Redis)并且我无法影响堆大小。

最佳答案

  1. 您可以增加堆的大小。堆的大小可以是配置为大于服务器的物理内存大小,同时您确保条件正确:

    the size of heap + the size of other applications < the size of physical memory + the size of swap space

    例如,物理内存为4G,交换空间为4G,堆大小可配置为6G。

    但是程序会受到页面交换的影响。

  2. 您可以使用一些数据库,例如 Redis 。 Redis 是键值对数据库并具有列表结构。

    我认为这是解决您的问题的最简单方法。

  3. 您可以压缩 Result 实例。首先,您序列化实例并压缩它。并定义类:

    class CompressResult { 
    byte[] result;
    //...
    }

    并将 Result 替换为 CompressResult。但你应该反序列化当你想使用它时的结果。

    如果 Result 类有很多字段并且非常多,那么它会很好地工作。复杂。

关于java - 如果我需要的内存多于 Java 堆中的内存,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183296/

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