Java8获取数据并保存在哈希图中,性能问题

时间:2019-02-23 06:10:38

标签: java-8 parallel-processing concurrenthashmap

我有一个637200个Rollids列表,我用它们遍历并从dynamodb表中获取它们,并尝试将其存储在hashmap中。我试图将其添加到大约8 Threads

的自定义HashMap<String, List<Details>> studentRecord = new HashMap<>(); rollIds.parallelStream(id -> { Details d = fetchDataStudentDao.getStudentById(id); studentRecord.put(id, d); });
getStudentById

注意:我无法控制id,因为它来自我不应该更改的其他软件包。

我在使用并行流时遇到问题,因为映射不正确。拥有一个HashMap的学生将被映射到其他一些学生详细信息。

在对此进行更多检查时,我发现concurrentHashMap并不是线程安全的,因此不应使用ConcurrentHashmap或forEach。

如果我使用forEach,则要花费4个小时以上才能得到结果。但是,如果我使用parallelStreams,它大约比forEach快3个小时左右,但结果不正确。

我面临的问题,应该使用哪种解决方案?我不确定在这种情况下如何使用 let highQueue = DispatchQueue.global(qos: .userInteractive) let videoDataOutputQueue = DispatchQueue(label: "com.apple.sample.capturepipeline.video", attributes: [], target: highQueue) ,会更快吗?

或以其他任何方式可以使其更快,非常需要一些帮助和指导。

2 个答案:

答案 0 :(得分:0)

您的put(id,d)仅放置一个细节,而不是细节列表。

答案 1 :(得分:0)

改为尝试此代码

Map<String, Details> studentRecords = rollIds.parallelStream()
          .collect(Collectors.toMap(Functions.identity(), id -> fetchDataStudentDao.getStudentById(id)));