2012-03-02 2 views
2

У меня есть два очень больших списка строк, один из которых содержит несколько идентификаторов (более 70 тыс.) И еще один список, содержащий некоторые сообщения String, каждая строка содержит идентификатор (более 400 тыс. Записей). Мне нужно, чтобы каждый идентификатор из первого списка получал все сообщения с одинаковым идентификатором из второго списка. Я попытался создать несколько потоков, для каждого идентификатора из первого списка, итерации всего второго списка и извлечения & удалите это сообщение. Кажется, это создает слишком много объектов Iterator, в результате чего OOM не хватает памяти. Кроме того, при повторении второго списка CPU составляет 100%. Какие-либо предложения? Я могу изменить реализацию, а также контейнеры, в которых хранятся сообщения.Эффективный способ сопоставления двух идентификаторов из двух очень длинных контейнеров

Спасибо.

while (condition) {      
    <Message> iterator = msgQueue.iterator(); 
       while (iterator.hasNext()) { 
        Message message = iterator.next(); 

        if (filter.filter(message)) { 
         iterator.remove(); 
        } 
       } 
      } 

ответ

0

Я бы поставил эти объекты не в два списка, как вы делали, но в карте, где ключ является Id из первого списка, а значения является набор сообщений, содержащих Id.

4

Преобразуйте свой второй список в HashMap<String, List<String>> (ключ - это идентификатор, а значение - список сообщений, содержащих этот идентификатор). Затем перейдите в свой первый список и получите соответствующие сообщения с карты.

Вы можете использовать одну из реализаций Guava MultiMap.

0

Менее пронизанный алгоритм может сделать. Сортировка обоих списков по идентификатору и выбор диапазона идентификаторов (списка списков?) Для итерации будут быстрее и, следовательно, возможны для последовательной обработки или меньше потоков.

Смежные вопросы