2 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
我嘗試matrixDistance用 來改變distanceTable。嘗試將此代碼移至不同的方法中,以便可以并行運(yùn)行它
for(int i = 0; i < matrixDistance.length - 1; ++i) {
distanceTable[i] = new double[i + 1];
for(int j = 0; j <= i; ++j) {
double distance = 0.0;
for(int k = 0; k < DataSet[i+1].length; ++k) {
double difference = Double.parseDouble(DataSet[j][k]) - Double.parseDouble(DataSet[i+1][k]);
distance += difference * difference;
}
distanceTable[i][j] = distance;
}
}
我根據(jù)你的問題創(chuàng)建了這個(gè)例子。
public void parallel(String file)
....
// parsing from csv into matrix 2d Double[][]
....
IntStream
.range(1, data.length - 1)
.parallel()
.forEach(i -> {
add(euclidian.euclidian(Arrays.copyOf(data, i+1)), i);
});
}
這是你的算法的迷你版本。
public Double[] euclidian(Double[][] data) {
Double[] result = new Double[data.length - 1];
for (int i = 0; i < result.length; i++) {
result[i] =
Math.pow(data[i][0] - data[data.length - 1][0], 2) +
Math.pow(data[i][1] - data[data.length - 1][1], 2);
}
return result;
}
并且由于并行執(zhí)行,您需要添加鎖定方法以將數(shù)據(jù)插入distanceTable。
private final Object lock = new Object();
Double[][] distanceTable;
void add(Double[] data, int index){
synchronized (lock) {
distanceTable[index - 1] = data;
}
}
我已經(jīng)在我的筆記本電腦上測(cè)試了它,對(duì)于 csv 文件中的 74 行,比較如下(ORI 使用您的代碼,PAR 使用我的方法):
java -jar target/stream-example-1.0-SNAPSHOT.jar test.csv
#####################
ORI read: 59 ms
ORI map: 71 ms
ORI time: 80 ms
#####################
PAR read: 0 ms
PAR map: 6 ms
PAR time: 11 ms
希望能幫助到你。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
例如,使用Double.parseDouble@Fahim Bagar 提供的代碼示例可以輕松消除浪費(fèi)String[][] DataSetDouble[][] DataSet
//String[][] DataSet = Matrix.map(mapping -> mapping.split(",")).toArray(String[][]::new);
Double[][] DataSet = Matrix.map(row -> Arrays.stream(row.split(",")).map(Double::parseDouble).toArray(Double[]::new)).toArray(Double[][]::new);
然后在循環(huán)之外獲取局部變量的DataSet[i + 1]各種數(shù)組引用:DataSet[j]
for (int i = 0; i < distanceTable.length - 1; ++i) {
Double[] arriplus1 = new Double[i + 1];
Double[] iarr = DataSet[i + 1];
for (int j = 0; j <= i; ++j) {
double distance = 0.0;
Double[] jarr = DataSet[j];
for (int k = 0, sz = iarr.length; k < sz; ++k) {
double difference = jarr[k] - iarr[k];
distance += difference * difference;
}
arriplus1[j] = distance;
}
distanceTable[i] = arriplus1;
}
您可以對(duì)@Fahim Bagareuclidian方法做同樣的事情
public Double[] euclidian(Double[][] data) {
Double[] result = new Double[data.length - 1];
Double[] dL1 = data[data.length - 1];
for (int i = 0; i < result.length; i++) {
Double[] di = data[i];
result[i] = Math.pow(di[0] - dL1[0], 2) + Math.pow(di[1] - dL1[1], 2);
}
return result;
}
之后,擺脫Double并使用double將進(jìn)一步加快/減少內(nèi)存分配。
在 CSV 第 1048 行中,我在每次運(yùn)行第 10 次時(shí)看到這些計(jì)時(shí):
#####################
ORI read: 0 ms
ORI map: 4 ms
ORI time: 14 ms
#####################
PAR read: 0 ms
PAR map: 1 ms
PAR time: 10 ms
添加回答
舉報(bào)