[英]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.