2 Stimmen

Effiziente Methode zum Abgleich zweier IDs aus zwei sehr langen Containern

Ich habe zwei sehr große Listen von String, eine mit einigen IDs (über 70k) und eine andere Liste mit einigen String-Nachrichten, wobei jede Zeile eine ID enthält (über 400k Einträge). Ich brauche, dass für jede ID aus der ersten Liste, um alle Nachrichten mit der gleichen ID aus der zweiten Liste zu erhalten. Ich habe versucht, einige Threads zu erstellen, die für jede ID aus der ersten Liste die gesamte zweite Liste iterieren und die Nachricht abrufen und entfernen. Dies scheint zu viele Iterator-Objekte zu erzeugen, was zu OOM führt, wenn nicht genügend Speicher vorhanden ist. Außerdem ist die CPU bei der Iteration der zweiten Liste zu 100% ausgelastet. Irgendwelche Vorschläge? Ich kann die Implementierung ändern, auch die Container, wo ich die Nachrichten halten.

Gracias.

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

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

4voto

JB Nizet Punkte 654813

Verwandeln Sie Ihre zweite Liste in eine HashMap<String, List<String>> (der Schlüssel ist die ID, und der Wert ist eine Liste von Nachrichten, die diese ID enthalten). Durchlaufen Sie dann Ihre erste Liste und holen Sie die entsprechenden Nachrichten aus der Karte.

Sie könnten eines der Guava's MultiMap Implementierungen.

0voto

javagirl Punkte 1595

Ich würde diese Objekte nicht in zwei Listen ablegen, wie Sie es getan haben, sondern in eine Map, wobei der Schlüssel die Id aus der ersten Liste ist und die Werte die Menge der Nachrichten, die die Id enthalten.

0voto

Joop Eggen Punkte 101784

Ein Algorithmus mit weniger Überschneidungen kann ausreichen. Die Sortierung beider Listen nach ID und die Iteration eines Bereichs von IDs (Liste von Listen?) ist schneller und daher für die sequentielle Verarbeitung oder weniger Threads geeignet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X