我有两个非常庞大的String列表,一个包含一些ID(超过70k),另一个包含一些String消息,每行包含一个ID(超过400k条目)。我需要为第一个列表中的每个ID获取第二个列表中具有相同ID的所有消息。我尝试通过为第一个列表中的每个ID创建一些线程,迭代整个第二个列表并检索并删除该消息。这似乎创建了太多的Iterator对象,导致OOM内存不足。此外,迭代第二个列表时CPU为100%。有什么建议?我可以改变实现,也就是我保留消息的容器。
感谢。
while (condition) {
<Message> iterator = msgQueue.iterator();
while (iterator.hasNext()) {
Message message = iterator.next();
if (filter.filter(message)) {
iterator.remove();
}
}
}
答案 0 :(得分:4)
将您的第二个列表转换为HashMap<String, List<String>>
(密钥是ID,值是包含此ID的消息列表)。然后遍历您的第一个列表并从地图中获取相应的消息。
您可以使用Guava的MultiMap实现之一。
答案 1 :(得分:0)
我将这些对象放在两个列表中,就像你一样,但是在Map中,键是第一个列表中的Id,值是包含Id的消息集。
答案 2 :(得分:0)
较少的线程算法可以做到。按ID对两个列表进行排序并采用一系列ID(列表列表?)进行迭代将更快,因此可用于顺序处理或更少的线程。