【问题标题】:Efficient way to match two IDs from two very long containers从两个非常长的容器中匹配两个 ID 的有效方法
【发布时间】:2012-03-20 20:22:46
【问题描述】:

我有两个非常大的字符串列表,一个包含一些 ID(超过 70k),另一个列表包含一些字符串消息,每行包含一个 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();
                    }
                }
            }

【问题讨论】:

    标签: java string algorithm list


    【解决方案1】:

    我不会像您那样将这些对象放入两个列表中,而是在 Map 中,其中键是第一个列表中的 Id,值是包含 Id 的消息集。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2016-12-02
          • 2011-09-25
          • 2015-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          相关资源
          最近更新 更多