我正在实现一种基于概率潜在语义索引(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 数组,但还有其他解决方案吗?
答案 0 :(得分:2)
如果你确实需要所有内存,那么你需要所有内存。
有一些替代方案:
您可以考虑使用内存映射文件。
如果数组中有很多零,你可以将它存储为稀疏矩阵表示(不要显式存储0)。
如果您不需要同时在内存中存储整个内容,您还可以将其存储在某种持久存储(文件,数据库等)中,并且只能在任何给定时间访问您需要的部分。
答案 1 :(得分:0)
如果以我的方式分配数组,是否连续分配内存?是因为java对连续内存有内存限制吗?如果是这样,那么限制是什么?
不,JVM无法为您的阵列分配内存。 如果为数组使用float,则必须将最大内存堆空间设置为16GB。 您可以使用file来存储数组。