【发布时间】:2020-02-23 17:04:12
【问题描述】:
我正在尝试使用多维数组([verybigrow][2])制作矩阵算术运算方法。我是新手,我只是找不到我做错了什么。非常感谢任何帮助告诉我它是什么。
try {
Stream<String> Matrix = Files.lines(Paths.get(file)).parallel();
String[][] DataSet = Matrix.map(mapping -> mapping.split(",")).toArray(String[][]::new);
Double[][] distanceTable = new Double[DataSet.length - 1][];
/* START WANT TO REPLACE THIS MATRIX CALCULATION WITH PARALLEL STREAM RATHER THAN USE TRADITIONAL ARRAY ARITHMETICS START */
for (int i = 0; i < distanceTable.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;
}
}
/* END WANT TO REPLACE THIS MATRIX CALCULATION WITH PARALLEL STREAM RATHER THAN USE TRADITIONAL ARRAY ARITHMETICS START */
} catch ( Exception except ){
System.out.println ( except );
}
我宁愿不使用库或类似的东西,我这样做主要是为了了解它是如何工作的。非常感谢你。如果你问数据看起来像:
4,53
5,63
10,59
9,77
13,49
数据处理的输出应该是这样的:
[101] <- ((4-5)^2) + ((53-63)^2)
[72, 41] <- ( ((4-10)^2) + ((53-59)^2) ), ( ((5,10)^2) + ((63-59)^2))
[601.0, 212.0, 325.0]
[97.0, 260.0, 109.0, 800.0]
[337.0, 100.0, 109.0, 80.0, 400.0]
【问题讨论】:
-
发生的事情不是你所期望的?
-
是的,如果在小数据中运行,该程序就可以工作。但是如果最大数据超过 100 万,则会出现内存堆错误
-
我在您的代码中看不到
multithreading、parallel-processing、bigdata。请不要添加不必要的标签。 -
首先:了解java命名约定。变量和字段名称采用驼峰命名法。然后:不要从并行流开始。如果有的话,只需使用普通流。以最直接最简单的方式解决您的问题。只有当这行得通,并且您了解您正在做的所有事情时,然后才开始研究接下来的步骤。然后:请告诉我们您的矩阵计算应该得到什么结果。不要将您的代码扔给我们,以便我们确定您在那里尝试做什么。告诉我们。
-
*叹息* 是的,当然。首先将您的
String DataSet[][]转换为Double DataSet[][],然后使用值 进行计算,而不是调用parseDouble百万 次。您会看到计算速度快了约 10 倍,没有并行化。如果您想要一个高效的并行解决方案,那么当前的答案当然也不是最好的方法。
标签: java multithreading parallel-processing