2017-10-03 1 views
-1

Ich habe große Karte, wo ich einige Objekte speichern. Die Karte ist groß: Sie hat ungefähr 200.000 Objekte. Wenn ich versuche, einige Methoden auszuführen, die das Lesen von Kartenwerten erfordern, bleibt das Programm stehen. Wenn ich es debugge, scheint es, dass meine IDE "Daten sammelt" (Bild). Es hat die Aufgabe nie abgeschlossen.Große Karte einfriert mein Programm

enter image description here

Ich habe 16 GB RAM. Was kann ich tun, um dies zu beschleunigen?

+0

Hallo, fügen Sie Element in der Karte während der Ausführung ein? Welcher Objekttyp ist in der Karte gespeichert? – Tuco

+1

Wie viel RAM haben Sie der JVM zugewiesen? Könnten Sie die RAM-Nutzung mit der jconsole überwachen? (Sie sollten auch überlegen, wie groß die Objekte auf der Karte auch sind) – gusto2

+0

Was hält Ihre Karte? Was hast du schon probiert? –

Antwort

-1

Blick auf this - als Lösung Sie die Heap-Größe für Ihre Anwendung erhöhen:

java -Xmx6g myprogram.

Aber es ist nicht sehr gut. Ich würde vorschlagen, dass Sie versuchen, Ihren Datenverarbeitungsansatz zu überarbeiten. Vielleicht können Sie vor dem Abrufen der Daten eine Filterung anwenden, um die Datengröße zu verringern oder eine Berechnung auf Datenbankebene zu implementieren.

+0

200K Elemente in einer Karte ist nicht zu viel, und sollte wahrscheinlich nicht zu einer solchen Leistungsminderung führen. – matt

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17515024) –

+0

Ein Grund für einen Downvote? – slesh

0

Ich bekomme Leistungsprobleme rund 61 Millionen Elemente.

import java.util.*; 

public class BreakingMaps{ 


    public static void main(String[] args){ 

      int count = Integer.MAX_VALUE>>5; 
      System.out.println(count + " objects tested"); 
      HashMap<Long, String> set = new HashMap<>(count); 
      for(long i = 0; i<count; i++){ 
       Long l = i; 
       set.put(l, l.toString()); 
      } 

      Random r = new Random(); 
      for(int i = 0; i<1000; i++){ 
       long k = r.nextInt()%count; 
       k = k<0?-k:k; 
       System.out.println(set.get(k)); 
      } 

     } 

} 

Ich betreibe das Programm mit java -Xms12G -Xmx13G BreakingMaps

Ich vermute, dass das Problem nicht die Karte ist, aber die Umstände die Karte umgibt. Wenn ich dasselbe Programm schreibe, aber eine Klasse mit Hashcode-Kolonien verwende, kann das Programm keine 200K-Elemente verarbeiten.

static class Key{ 
    final long l; 
    public Key(long l){ 
     this.l = l; 
    } 

    @Override 
    public int hashCode(){ 
     return 1; 
    } 

    @Override 
    public boolean equals(Object o){ 
     if(o!=null && o instanceof Key){ 
      return ((Key)o).l==l; 
     } 
     return false; 
    } 

}