GTGraph编译参考这篇文章: https://blog.youkuaiyun.com/robertchenguangzhi/article/details/40995249,需要将icc改为gcc
./GTgraph-random -t 1 -n 1000 -m 10000 -o test.txt
RT,使用了一个图生成器GTGraph,但是发现其随机方法1生成的数据顺序但不连续,不利于使用如metis等划分软件(均要求顶点ID连续)。
p sp 100000 100000
a 1 25369 43
a 2 99456 48
a 3 37443 92
a 4 35745 70
a 5 60369 65
a 6 26032 87
a 7 69043 25
a 8 12628 0
a 8 51247 53
a 10 91163 5 //缺少9
a 11 42587 50
a 11 1158 44
a 71 88497 9 //在这呢
解决方法:1. 补充相关点和一条自旋边,即增加9 9 这样一条边,这样就能用于metis等软件划分了。
方法1的代码:
package gtGraph;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
public class GraphChecker {
/**
* @param args
*/
public static void main(String[] args) {
File test = new File("E:\\GTGraph\\sampleGraph_50m.txt") ;
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(test));
RandomAccessFile raf = new RandomAccessFile("E:\\GTGraph\\resultGraph_1.txt", "rw");
String tempString = null;
long start = System.currentTimeMillis() ;
Integer oldKey = -1 ;
StringBuffer sb = null ;
Integer indexCheck = 1 ; //用于检查编码连续性
while ((tempString = reader.readLine()) != null)
{
if (tempString != null && !"".equals(tempString)) {
String[] keyValues = tempString.split(" ");
if(!keyValues[0].equals("a"))
continue ;
Integer key = Integer.parseInt(keyValues[1]);
Integer value = Integer.parseInt(keyValues[2]);
if(oldKey == -1) { //首行读取
sb = new StringBuffer() ;
sb.append(key).append("\t").append(value) ;
oldKey = key ;
if(!indexCheck.equals(key)) {
System.out.println("初始编码!=1");
indexCheck = key ;
}
continue ;
} else {
if(!key.equals(oldKey)){
sb.append("\n") ;
raf.write(sb.toString().getBytes()) ;
oldKey = key ;
while(!key.equals(new Integer(indexCheck + 1) )) { //补充不连续顶点及自旋边
System.out.println("编码不连续!" + key);
StringBuffer appStr = new StringBuffer().append(indexCheck+1).append("\t").append(indexCheck+1).append("\n") ;
raf.write(appStr.toString().getBytes());
indexCheck++ ;
}
indexCheck++ ;
sb = new StringBuffer() ;
sb.append(key).append("\t").append(value) ;
} else
sb.append("\t").append(value) ;
}
}
}
raf.write(sb.toString().getBytes()) ;
raf.close() ;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
--------------------------------------------2018-7-6
很不幸,第一种方法被证明是不对的,因为会出现空置点的情况,比如GtGraph号称生成10个点,但中间比如点5可能根本不存在,也没有目标点为点5的边。因此不适应metis划分,必须使用我之前自己设计的分布式重编码算法了。无语。。。。
--------------------------------------------2018-7-16
2.使用我之前设计的分布式重编码算法。