我的问题主要是根据已有的数值,建立一个矩阵然后好进行图的遍历。元素少的时候运行起来都是成功的。我知道元素多了之后肯定会有内存溢出。虽然我把内存值调大了-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多万的二维数组。有没有别的可以替代的方法来解决这个问题?
求教如何才能处理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多万的二维数组。有没有别的可以替代的方法来解决这个问题?
利用文件处理超大集合是一种解决方案,可以参考《Java Pitfalls》中Item 19的介绍,开源的缓存组件网上也有不少,可以拿过来就用。另外,使用内存数据库是更好的选择!
10万*10万的数量级用bitset也搞不定
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 当然会内存溢出。如果这样用邻接表的话会成功么?我不会邻接表,准备学学。上面还有人说的用数据库或者文件一点一点处理的我也不会。我在哪里能学到?只条路呗
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
1)用文件存储,分步写,分步读
2)改进内存存储效率,如具体分析图的特点,进行压缩读取,解压读(时间换空间)
3)“400 亿字节就是 37.25GB,你想塞到内存中么?”这个是可以读到内存里的,你用jdk1.6以上 的64位版本,据说支持的内存是T级的,几十G不算什么
代码中定义了一个四维数组
int[,,,] olist =new int[3000,200,4,160];
程序一执行,就内存溢出了。现在还没解决办法
通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量.
常量数据保存在常量池中。