【发布时间】:2017-03-26 18:33:27
【问题描述】:
我有一堆列作为 csv 文件中的字符串数组。现在我想解析它们。由于这种解析需要日期解析和其他不那么快的解析技术,我正在考虑并行性(我计时了,这需要一些时间)。我的简单方法:
Stream.of(columns).parallel().forEach(column ->
result[column.index] = parseColumn(valueCache[column.index], column.type));
Columns 包含ColumnDescriptor 元素,它只有两个属性,要解析的列索引和定义如何解析它的类型。没有其他的。 result 是一个 Object 数组,它采用结果数组。
现在的问题是 parse 函数抛出一个 ParseException,我在调用堆栈中处理得更远。由于我们在这里是并行的,它不能只是被抛出。处理这个问题的最佳方法是什么?
我有这个解决方案,但我有点畏缩阅读它。有什么更好的方法?
final CompletableFuture<ParseException> thrownException = new CompletableFuture<>();
Stream.of(columns).parallel().forEach(column -> {
try {
result[column.index] = parseColumn(valueCache[column.index], column.type);
} catch (ParseException e) {
thrownException.complete(e);
}});
if(thrownException.isDone())
//only can be done if there is a value set.
throw thrownException.getNow(null);
注意:我不需要所有的例外。如果我按顺序解析它们,我也只会得到一个。所以没关系。
【问题讨论】:
-
对我来说,其他可能性是可读的>
-
我想这更像是一个实验,因为与从 CSV 文件读取相比,解析不太可能占用大量时间(即,这是过早的优化)。如果您在读取文件的同时进行解析,您可能会发现所有内容都在读取完成的同时被解析。
-
读取数据是一次性操作。但是解析将使用不同的设置重复进行。这就是为什么我要优化那部分。
-
为什么你的“简单方法”不起作用?除了声称你做不到之外,你没有解释这一点。
标签: java exception-handling parallel-processing java-8 java-stream