1

我正在实现一个基于概率潜在语义索引(plsa)的算法,论文在这里,它需要一个名为 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对连续内存有内存限制吗?如果是这样,限制是多少?

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

4

2 回答 2

2

如果你真的需要所有的内存,那么,你需要所有的内存。

有一些替代方案:

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

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

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

于 2013-07-11T01:25:08.377 回答
0

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

不,JVM 不能为您的数组分配内存。如果对数组使用浮点数,则必须将最大内存堆空间设置为 16GB。您可以使用文件来存储您的数组。

于 2013-07-11T03:08:35.273 回答