簡體   English   中英

Java中的大數組導致的內存不足異常

[英]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數組,但是還有其他解決方案嗎?

如果您確實需要所有這些內存,那么您就需要所有這些內存。

有一些替代方法:

  1. 您可以考慮使用內存映射文件。

  2. 如果數組中有很多零,則可以將其存儲為稀疏矩陣表示形式(不要顯式存儲0)。

  3. 如果您不需要一次將整個內容存儲在內存中,也可以將其存儲在某種持久性存儲中(文件,數據庫等),並且僅在任何給定時間訪問所需的部分。

如果以我的方式分配數組,是否連續分配內存? 是因為Java對連續內存有內存限制嗎? 如果是這樣,有什么限制?

不,JVM無法為您的陣列分配內存。 如果對數組使用float,則必須將最大內存堆空間設置為16GB。 您可以使用文件存儲陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM