从两个非常长的容器中匹配两个ID的有效方法

时间:2012-03-02 10:14:24

标签: java string algorithm list

我有两个非常庞大的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();
                    }
                }
            }

3 个答案:

答案 0 :(得分:4)

将您的第二个列表转换为HashMap<String, List<String>>(密钥是ID,值是包含此ID的消息列表)。然后遍历您的第一个列表并从地图中获取相应的消息。

您可以使用Guava的MultiMap实现之一。

答案 1 :(得分:0)

我将这些对象放在两个列表中,就像你一样,但是在Map中,键是第一个列表中的Id,值是包含Id的消息集。

答案 2 :(得分:0)

较少的线程算法可以做到。按ID对两个列表进行排序并采用一系列ID(列表列表?)进行迭代将更快,因此可用于顺序处理或更少的线程。