Mar*_*rco 5 java memory performance matrix data-structures
我需要存储一个包含邮政编码的2d矩阵,以及每个矩阵之间的距离.我的客户端有一个计算距离的应用程序,然后存储在Excel文件中.目前,有952个地方.因此矩阵将具有952x952 = 906304个条目.
我试图将其映射到HashMap [Integer,Float].Integer是两个字符串的哈希码,例如"A"和"B".浮点值是它们之间的距离(以km为单位).
填写数据时,我会在205k条目后运行OutOfMemoryExceptions.你有一个提示,我怎么能以聪明的方式存储它?我甚至不知道将整个人群放在记忆中是否聪明.我的选择是SQL和MS Access ......
问题是我需要非常快速地访问数据,这可能是我选择HashMap的原因,因为它在O(1)中运行以进行查找.
Thansk的回复和建议!
马尔科
2d阵列将更有效地记忆.您可以使用小型散列映射将952个位置映射到0到951之间的数字.然后,就这样做:
float[][] distances= new float[952][952];
Run Code Online (Sandbox Code Playgroud)
要查找,只需使用两个哈希查找将两个位置转换为两个整数,并将它们用作二维数组的索引.
通过这种方式,你可以避免浮动的装箱,以及大型hashmap的内存开销.
但是,906304确实不是那么多条目,你可能只需要增加Xmx的最大堆大小
您可以简单地增加 JVM 可用的内存吗?
java -Xmx512m ...
Run Code Online (Sandbox Code Playgroud)
默认情况下最大内存配置为 64Mb。这里还有一些更多的调整技巧。如果您能做到这一点,那么您可以保持数据在处理中并最大限度地提高性能(即您不需要即时计算)。