日期:2014-05-20  浏览次数:21211 次

需要定义几个10000*300000的数组,但是总是 java.lang.OutOfMemoryError异常
我直接在eclipse里面定义int [][] a = new int[10000][3000000]
运行以后就报eclipse java.lang.OutOfMemoryError: Java heap space
我在‘Run as ->Open Run Dialog...’,选择(x)=Argument标签页下的vm arguments框里输入 -Xmx1000m,
我的电脑的内存是1G的,我没办法为jvm设置更高的-Xmx了

这10000*300000数据是从文本里读出来的,实际上后续可能还会需要处理更大规模的数据。
有人说可以使用第三方缓存,比如oscash之类
但是我不知道怎么用,大家谁能帮帮我呢
谢谢啦。



------解决方案--------------------
不能一次性加载这么大的文件,要一段一段的读, 一部分处理一部分。

你机器内存即使有10个G也不行。jvm认不了那么多


------解决方案--------------------
数组超范围。你的数也太大了。
可以把数据分批次读。
------解决方案--------------------
分批处理吧,无论是什么样子的机器都不可能这么使用内容,风险太大

至于oscache之类的东西,其实就像大于在内存中存放一个Map 以键值对的形式存取值

和你这个需求没有什么关系
------解决方案--------------------
求详细需求
需要这么大的数组做什么用?
探讨
我直接在eclipse里面定义int [][] a = new int[10000][3000000]
运行以后就报eclipse java.lang.OutOfMemoryError: Java heap space
我在‘Run as ->Open Run Dialog...’,选择(x)=Argument标签页下的vm arguments框里输入 -Xmx1000m,
我的电脑的内存是……

------解决方案--------------------
你还是先切分文件 分批读取吧
------解决方案--------------------
总是研究这些不着边际的问题是没用的 

做点实际的事吧

踏踏实实的
------解决方案--------------------
非也非也
这些问题研究到一定阶段,
比整天玩某些框架要好的多
探讨
总是研究这些不着边际的问题是没用的

做点实际的事吧

踏踏实实的

------解决方案--------------------
 搞这么大个数组干啥用呢。

换个思路考虑一下
------解决方案--------------------
分段处理,这就涉及到算法了,不要什么都依赖于jvm,虽然很多时候你不需要知道具体的操作,
------解决方案--------------------
你内存估计找不到这么大连续空间。用list,并且启动的时候要设置参数(分配内存大小,当然,要比你的物理内存小)
------解决方案--------------------
10000*300000
想法有问题……
二维数组的空间占用要远远超过一维数组的
------解决方案--------------------
如果必须用数组,最好用64位的系统,Java可用内存也在大了很多,
否则,如果不是要把这个数组做很大改变的话,可以把它放到数据库中,由程序完成对它的操作。
------解决方案--------------------
要研究到一个阶段就深入下jvm。那里有你要的答案。