我的问题主要是根据已有的数值,建立一个矩阵然后好进行图的遍历。元素少的时候运行起来都是成功的。我知道元素多了之后肯定会有内存溢出。虽然我把内存值调大了-Xmx1400m还是不可以的。所以我觉得这方法是不治本的。
求教如何才能处理10多万个元素的情况?各位看一下代码,问题就出现在这里:public static int[][] conversionMatrix(String[][] relation, String[] element) 
{
 
                  int[][] M = new int[element.length][element.length];      
   

for (int k = 0; k < relation.length; k++)

 {
int i = 0, j = 0;
boolean isExistRow = false;
boolean isExistColumn = false;
for (int l = 0; l < element.length; l++) {

if (relation[k][0].equals(element[l])) {
i = l;
isExistRow = true;
}

if (relation[k][1].equals(element[l])) {
j = l;
isExistColumn = true;
}
}

if (isExistRow && isExistColumn) {
M[i][j] = 1;
}
}

return M;
}
利用已有的element和relation,建立int[][] M这个二维数组。内存溢出在这句话:   int[][] M = new int[element.length][element.length];  此时element的长度有10多万。也就是说我需要建立一个10多万*10多万的二维数组。有没有别的可以替代的方法来解决这个问题?

解决方案 »

  1.   

    空间复杂度太高了,可以修改算法提高时间复杂度,然后降低空间复杂度。这属于大数据量问题,一般都是需要和文件系统交互的。比如可以把所有的数据存在硬盘上,然后每次只处理n*n,n*n可以保证内存存的下,然后处理完n*n就把他们写入硬盘,然后读取下一个n*n。只是提供了一个思路,lz看一下
      

  2.   


    利用文件处理超大集合是一种解决方案,可以参考《Java Pitfalls》中Item 19的介绍,开源的缓存组件网上也有不少,可以拿过来就用。另外,使用内存数据库是更好的选择!
      

  3.   

    这个得用其他方式了
    10万*10万的数量级用bitset也搞不定
      

  4.   

    100000 * 100000 = 10^10 啊!这可是 100 亿个数字啊!每个数字占用 4 个字节,就是 400 亿字节(这还不包括数组中的 length 常量)。400 亿字节就是 37.25GB,你想塞到内存中么?
      

  5.   

    我把流程先说一下,我主要是对一个存在数据库当中的100万条数据进行分析,看哪些记录有联系的,最终目的是想把都关联的数据记录归类到一组里面。经过分析之后,我首先得到的是两个文本文件:一个文件存的是所有检测出来的记录
    A={ID1, ID2, ID3, ID4,....ID100}另一个文本文件存的是一对一对检测出来的有关系的二元组,因为只能两两比较:
    R={<ID1, ID3>, <ID3, ID10>,<ID2, ID88>....}
    很显然,为了准确的把所有的关系写出来,我需要用一个传递闭包的算法来写出完整的关系集合:
    R‘={<ID1,ID3>,<ID1, ID10>, <ID3,ID10>, <ID2, ID88>}
    可以看到多出来的这个<ID1, ID10>就是利用闭包算法warshall作出来的现在有了元素,以及完整的关系R'我就可以利用DFS图的遍历来写出到底哪些元素是一组的,最终我想得到下面这样明确的分组。
    {ID1,ID3,ID10},{ID2,ID88}
    可是warshall算法,以及图的DFS遍历都要用到邻接矩阵的这样的一种表示。所以当元素个数A太大的时候,做一个A.length*A.length 当然会内存溢出。如果这样用邻接表的话会成功么?我不会邻接表,准备学学。上面还有人说的用数据库或者文件一点一点处理的我也不会。我在哪里能学到?只条路呗
      

  6.   

    这样吧,如果我把原始的二元关系R存到了数据表中如下:ID    RelatedID
    a         b
    a         c
    b         d
    c         f
    c         e
    g         h
    我怎么才能得到另一个表:
    Group           ID(s)
    1               a,b,c,d,f,e
    2               g,h
      

  7.   

    要是 ODBC 文本数据源的驱动也能技术像 Oracle Connect by 或 DB2 with 来实现的递归就好了。
      

  8.   

    方法:
    1)用文件存储,分步写,分步读
    2)改进内存存储效率,如具体分析图的特点,进行压缩读取,解压读(时间换空间)
    3)“400 亿字节就是 37.25GB,你想塞到内存中么?”这个是可以读到内存里的,你用jdk1.6以上 的64位版本,据说支持的内存是T级的,几十G不算什么
      

  9.   

    我猜楼主是在玩余弦相似性,然后cluster吧
      

  10.   

    我也遇到和楼主相同的问题了
    代码中定义了一个四维数组
    int[,,,] olist =new int[3000,200,4,160];
    程序一执行,就内存溢出了。现在还没解决办法
      

  11.   

    楼主内存调得应该不正确,试一试这个参数:
    通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量.
    常量数据保存在常量池中。