我有一个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)
,会更快吗?
或以其他任何方式可以使其更快,非常需要一些帮助和指导。
答案 0 :(得分:0)
您的put(id,d)仅放置一个细节,而不是细节列表。
答案 1 :(得分:0)
改为尝试此代码
Map<String, Details> studentRecords = rollIds.parallelStream()
.collect(Collectors.toMap(Functions.identity(), id -> fetchDataStudentDao.getStudentById(id)));