2012-06-21 35 views
1

我有一個稀疏的二維數據,每個含有高達約20功能約6萬條記錄設置。 我想這個轉換成非稀疏2D數據只有零的和來設定的,但我不斷收到的OutOfMemoryError。的OutOfMemoryError:Java堆空間:嘗試轉換〜5.7million記錄數據集

這裏是我的數據集的例子:

1: 1723762 2737 2 283 
2: 239 220 12 19237 2795 
3: 3910 2931 86043 26354 349874 73736 2611 93921 4123830 
4: 5 
5: 4728 2 
...(up to ~6mil) 

我想把它轉換成:

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...(up to ~6mil) 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
...(up to ~6mil) 

公告稱,第一行上,有一個1在第2列,因爲它在原始數據集中具有該特徵,在第5行的第4行第5列和第5行的第2列相同。

我已經創造了這樣的代碼,但它已經耗盡內存,當我嘗試以下方法:

File data = new File("dataSet.txt"); 
    Scanner in = new Scanner(data); 

    //check how many rows 
    int nRows = 0; 
    while (in.hasNextLine()) { 
     in.nextLine(); 
     nRows++; 
    }   

    //initializing the matrix 
    in.close(); 
    in = new Scanner(data); 
    int[][] matrix = new int[nRows][nRows]; 

看來它甚至不能處理那麼大的一個數組?我得到一個非稀疏矩陣是至關重要的。有沒有解決這個內存錯誤的辦法?

親切的問候,

+9

6mil X 6mil == 36萬億。即使這只是一些數據,這仍然是4.5TB的數據。你根本沒有得到一個地址空間接近大型的任何地方,所以你將需要找出一種方法來「流」,通過內存中的數據。另外,我想我有點困惑,爲什麼你絕對需要非稀疏矩陣。您執行的任何計算都可以抽象出來,這樣就不需要設置物理位。我認爲這是不適合印刷,無論是:) – dlev

+0

也許儘量不要保存所有的數據在緩存中查找到外部的方式來堅持它 –

+0

不知道你正在嘗試做的,但它看起來像行未分類。也許只需要對它們進行排序以獲得更好的性能即可?會給你日誌(n)訪問任何二進制搜索功能......如果n被限制爲20,那應該不會太差? –

回答

2

分配陣列中的更小,更容易管理的部分,使這些部分持續你對他們的工作後,然後根據需要再找一找。這裏的問題是你無法將整個事物一次性整理到內存中。你要處理的數據的巨大數額,並沒有額外的堆空間量會幫助你,如果你想建立一個6Mx6M矩陣。

相關問題