【发布时间】:2021-04-11 09:05:35
【问题描述】:
我有一个 Json 字符串列表,其中包含 电影 列表。我需要收集这些电影,处理它们并将它们存储在磁盘中。我正在考虑使用并行流方法来收集电影并测试其性能。我的做法是这样的:
以下方法生成电影列表。
protected abstract List<T> parseJsonString(JsonIterator iter);
此方法包含一个并行流,该流收集流中生成的所有列表的列表(List<List<Movies)):
public CompletableFuture<List<List<T>>> parseJsonPages(List<CompletableFuture<String>> jsonPageList)
{
return jsonPageList.parallelStream()
.map( jsonPageStr -> CompletableFuture.supplyAsync( () -> {
try {
return parseJsonString(JsonIterator.parse( jsonPageStr.get() ) );
}
catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
System.exit(-1);
}
return null;
} ) )
.collect( ParallelCollectors.toFuture( Collectors.toList() ) );
}
这种方法的问题在于流将生成电影列表,然后将所有列表附加到列表中。你认为这是收集所有这些电影的有效方式吗?我是否应该将所有列表中的电影合并到一个列表中,而不是仅将整个列表附加到列表中(即使这也需要一些时间)。如果是这样,我该如何执行这样的任务?
提前致谢。
【问题讨论】:
-
@EdwinDalorzo 你发给我的文章说:“考虑使用 S.parallelStream().operation(F) 而不是 S.stream().operation(F) 当操作是独立的,或者在计算上昂贵或适用于有效可拆分数据结构的许多元素,或两者兼而有之”。解析这些字符串中的每一个显然是独立的。此外,仅从字符串解析 json 对象需要大量计算时间。我有 1000 多个 Json 字符串。另外,我正在尝试测试这种方法的理论性能,而不仅仅是数秒...
标签: java list merge parallel-processing stream