java中的大数组引起的内存不足异常

时间:2013-07-11 01:19:12

标签: java out-of-memory

我正在实现一种基于概率潜在语义索引(plsa)的算法,论文是here,它需要一个名为p_z_d_wt_wv的四维数组,z是主题,d是文档,wt是文本单词,wv是视觉词,每个维度的数量大约是12,7000,100,500,而且数组是双数组,所以需要 32G内存 !! 我在下面这样分配这个内存,它只是用于演示,因为每个文档中的wt和wv的数量是不同的。

p_z_d_wt_wv = new double[12][7000][][]; 
for( int t = 0; t < 12; ++t) 
{ 
    for( int d = 0; d < 7000; ++d ) 
    { 
        p_z_d_wt_wv[t][d] = new double[100][500];
    } 
}

当我运行代码时,它的内存不足问题。 首先,为什么我的代码内存不足? 如果以我的方式分配数组,是否连续分配内存?是否因为java对连续内存有内存限制?如果是这样,那么限制是什么?

其次,我能做些什么来解决这个问题,假设服务器的内存足够大。 我知道我可以将其更改为 float 数组,但还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

如果你确实需要所有内存,那么你需要所有内存。

有一些替代方案:

  1. 您可以考虑使用内存映射文件。

  2. 如果数组中有很多零,你可以将它存储为稀疏矩阵表示(不要显式存储0)。

  3. 如果您不需要同时在内存中存储整个内容,您还可以将其存储在某种持久存储(文件,数据库等)中,并且只能在任何给定时间访问您需要的部分。

答案 1 :(得分:0)

如果以我的方式分配数组,是否连续分配内存?是因为java对连续内存有内存限制吗?如果是这样,那么限制是什么?

不,JVM无法为您的阵列分配内存。 如果为数组使用float,则必须将最大内存堆空间设置为16GB。 您可以使用file来存储数组。