Эффективный способ сопоставить два идентификатора из двух очень длинных контейнеров - PullRequest
2 голосов
/ 02 марта 2012

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

Спасибо.

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

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

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

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

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

0 голосов
/ 02 марта 2012

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

0 голосов
/ 02 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...