Optimization 优化超大哈希映射的内存使用

Optimization 优化超大哈希映射的内存使用,optimization,memory,hashmap,jvm,openstreetmap,Optimization,Memory,Hashmap,Jvm,Openstreetmap,我需要预处理OpenStreetMap中的数据。第一步是从未处理的.pbf文件(欧洲,~21GB)中存储一组节点(超过2亿个)。因此,我使用的是HashMap。将数据导入映射后,我的程序会检查每个节点是否满足某些条件。否则,节点将从贴图中删除。之后,映射中的每个剩余节点都会写入一个新的processed.pbf文件 问题是,这个程序使用的内存超过100GB。我想优化内存使用 我已经读到,如果使用了许多条目,我应该调整HashMap的初始容量和负载因子。现在我问自己,对于这两个参数,哪一个是最佳值

我需要预处理OpenStreetMap中的数据。第一步是从
未处理的.pbf
文件(欧洲,~21GB)中存储一组节点(超过2亿个)。因此,我使用的是HashMap。将数据导入映射后,我的程序会检查每个节点是否满足某些条件。否则,节点将从贴图中删除。之后,映射中的每个剩余节点都会写入一个新的
processed.pbf
文件

问题是,这个程序使用的内存超过100GB。我想优化内存使用

我已经读到,如果使用了许多条目,我应该调整HashMap的初始容量和负载因子。现在我问自己,对于这两个参数,哪一个是最佳值

我还看到,使用OracleJDK(1.8)的JVM时,内存负载的增长速度比使用OpenJDKJVM(1.8)时慢。我可以为OpenJDK JVM使用一些设置来最小化内存使用吗


谢谢您的帮助。

如果您在搜索键时不提供
加载因子和
初始大小,hashmap中将出现大量的
冲突

一般来说

default load factor = 0.75, we provide a 
initial size = ((number of data) / loadFactor) + 1

它提高了代码的效率。因为hashmap有更多的空间来存储数据,这减少了在搜索密钥时hashmap内部发生的冲突

您应该问自己的第一个问题是:是否真的需要将所有节点存储在内存中?我知道,还有其他解决方案,如数据库等。但是,我希望将其保存在内存中。是否需要将所有节点存储在内存中,然后处理映射?您不能以块的形式读取输入文件吗?查看一下您的代码,或者至少查看一些代码,这些代码显示了您是如何读取输入文件并将其条目存储在内存中的。对于这个特定的用例,是的。您没有说每个节点需要什么类型的信息。是否检查是否存在节点id,是否需要lat/lon,或者其他内容。这有很大的不同。您可能需要查看libosmium库中的这类任务。