[英]out of memory exception caused by big array in java
我正在实现一种基于概率潜在语义索引(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对连续内存有内存限制吗? 如果是这样,有什么限制?
其次,假设服务器的内存足够大,我该怎么办才能解决此问题。 我知道我可以将其更改为float数组,但是还有其他解决方案吗?
如果您确实需要所有这些内存,那么您就需要所有这些内存。
有一些替代方法:
您可以考虑使用内存映射文件。
如果数组中有很多零,则可以将其存储为稀疏矩阵表示形式(不要显式存储0)。
如果您不需要一次将整个内容存储在内存中,也可以将其存储在某种持久性存储中(文件,数据库等),并且仅在任何给定时间访问所需的部分。
如果以我的方式分配数组,是否连续分配内存? 是因为Java对连续内存有内存限制吗? 如果是这样,有什么限制?
不,JVM无法为您的阵列分配内存。 如果对数组使用float,则必须将最大内存堆空间设置为16GB。 您可以使用文件存储阵列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.