Xin*_*Guo 1 java jvm heap-memory jvm-arguments
我的java类读入一个60MB的文件,并生成HashMap一个HashMap包含超过3亿条记录的文件.
HashMap<Integer, HashMap<Integer, Double>> pairWise =
new HashMap<Integer, HashMap<Integer, Double>>();
Run Code Online (Sandbox Code Playgroud)
我已经将VM参数调整为:
-Xms512M -Xmx2048M
Run Code Online (Sandbox Code Playgroud)
但系统仍然适用:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.createEntry(HashMap.java:869)
at java.util.HashMap.addEntry(HashMap.java:856)
at java.util.HashMap.put(HashMap.java:484)
at com.Kaggle.baseline.BaselineNew.createSimMap(BaselineNew.java:70)
at com.Kaggle.baseline.BaselineNew.<init>(BaselineNew.java:25)
at com.Kaggle.baseline.BaselineNew.main(BaselineNew.java:315)
Run Code Online (Sandbox Code Playgroud)
在没有OOME失败的情况下运行需要多大的堆?
您的数据集非常大,无法在内存中处理它,这不是最终解决方案,只是一种优化.
你正在使用盒装基元,这是一个非常痛苦的事情.根据这个问题,盒装整数可以比未装箱的整数大20个字节.这不是我所谓的内存效率.
您可以使用专门的集合对其进行优化,这些集合不会封装原始值.提供这些的一个项目是Trove.你可以使用a TIntDoubleMap而不是你HashMap<Integer, Double>的TIntObjectHashMap而不是你的HashMap<Integer, …>.
因此,您的类型将如下所示:
TIntObjectHashMap<TIntDoubleHashMap> pairWise =
new TIntObjectHashMap<TIntDoubleHashMap>();
Run Code Online (Sandbox Code Playgroud)
现在,做数学.
300.000.000 Doubles,每个24字节,使用7.200.000.000字节的内存,即7.2 GB.
如果存储300.000.000 double秒,每个占用4个字节,则只需要1.200.000.000字节,即1.2 GB.
恭喜,您节省了以前用于存储数字的大约83%的内存!
请注意,此计算是粗略的,取决于平台和实现,并不考虑用于HashMap/T*Maps的内存.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |