我有一个学校的大数据项目,需要我们构建和查询8节点的Cassandra系统。系统必须包含至少7 TB的数据。我必须自己生成所有这些数据。不需要数据与赋值“相关”,即每一列可以只是一个随机整数。话虽如此,要求每个值是随机的或基于随机序列。
因此,我编写了一个简单的Java程序来生成随机ints
。我可以在~200 MB
中生成随机测试数据的~120s
。现在除非我的数学不上课,否则我想我会很烦。35000
中有200MB
7 terabytes
个单位。
35000 * 120 = 4 200 000 seconds
4200 000/3600〜1167hours
1167/24 = 49 days
因此,似乎需要49天才能生成所有需要的测试数据。显然,这是不切实际的。我正在寻找可以提高生成数据速度的建议。
我已经考虑/考虑:
将复制因子设置为8,以减少需要生成的数据量,并在所有8个节点上运行数据生成程序。
编辑:我如何生成数据
private void initializeCols(){
cols = new ArrayList<Generator>();
cols.add(new IntGenerator(400));
}
public ArrayList<String> generatePage(){
ArrayList<String> page = new ArrayList<String>();
String line = "";
for(int i = 0; i < PAGE_SIZE; i++){
line = "";
for(Generator column : cols){
line += column.gen();
}
page.add(line);
}
return page;
}
最初,我生成更多的
test specific
数据,例如phone numbers
等,但是后来我决定只生成随机的ints
以便节省一些时间-节省不了多少。这是IntGenerator
类。public IntGenerator(int series){
this.series = series;
}
public String gen(){
String output = "";
for(int i = 0; i < series; i++){
output += Integer.toString(randomInt(1,1000));
output += SEPERATOR;
}
return output;
}
最佳答案
由于您要在循环中执行许多串联操作,因此我强烈建议您检出StringBuilder。它将大大提高循环速度。例如,
public String gen(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < series; i++){
sb.append(Integer.toString(randomInt(1,1000)));
sb.append(SEPERATOR);
}
return sb.toString();
}
并且您也应该在generatePage方法中执行类似的操作。