2009-08-12 20 views
1

gerade jetzt, ich muss riesige Daten von der Datenbank in einen Vektor laden, aber wenn ich 38000 Zeilen von Daten geladen, das Programm OutOfMemoryError Ausnahme auswerfen. Was kann ich tun, um damit umzugehen?Wie zu handhaben riesige Daten in Java

glaube, ich kann es einige Speicherleck in meinem Programm, gute Methoden, es zu erkennen? Dank

+0

Danke für Ihre Antworten, aber ich möchte nicht meine Heap-Größe erhöhen, ich denke, ich muss einen guten Algorithmus finden. – MemoryLeak

+2

@Hooligan: Sagen Sie uns, warum Sie die Daten in einen Vektor laden, und vielleicht können wir Ihnen einen guten Algorithmus anbieten. – Brian

+0

Unser altes Programm begegnet einem solchen Outofmemoryerror, also muss ich es optimieren, und das Programm hat alle Daten in das Feld geladen und dann darauf basierend verarbeitet. – MemoryLeak

Antwort

7

den Speicher Ihres JVM (gewöhnlich mit -Xmx/-Xms) oder nicht laden alle Daten in Erinnerung.

Für viele Operationen mit großen Datenmengen gibt es Algorithmen, die nicht auf einmal Zugriff auf alle Daten benötigen. Eine Klasse solcher Algorithmen ist divide and conquer algorithms.

0

Lassen Sie Ihr Programm mehr Speicher oder viel besser, die Strategie zu überdenken. Benötigen Sie wirklich so viele Daten im Speicher?

+0

@JoshJordan TX für die Bearbeitung –

1

Sie können versuchen, die Heap-Größe zu erhöhen:

java -Xms<initial heap size> -Xmx<maximum heap size> 

Standard ist

java -Xms32m -Xmx128m 
+0

Maximum wäre 1024m, abhängig von Ihrer Plattform (maximal zuweisbarer Speicherblock scheint es). –

+1

Er sagte, dass das Programm OutOfMemoryError nach 38000 Zeilen von Daten warf, ich denke, dass es mehr gibt, ich kann nicht weiter erhöhen die Größe des Heapspeichers zu halten. –

+0

Soweit ich weiß gibt es kein Maximum. Ich laufe mit 4GB Heap. – Tommy

1

Müssen Sie wirklich ein so großes Objekt im Speicher haben?

Je nachdem, was Sie mit diesen Daten zu tun haben, können Sie es in kleinere Stücke teilen.

1

Laden Sie die Daten Abschnitt für Abschnitt. Dadurch können Sie nicht alle Daten gleichzeitig bearbeiten, aber Sie müssen den für die JVM bereitgestellten Speicher nicht ändern.

1

Vielleicht optimieren Sie Ihre Datenklassen? Ich habe einen Fall gesehen, in dem jemand Strings anstelle von nativen Datentypen wie int oder double für jedes Klassenmitglied verwendet hat, das einen OutOfMemoryError beim Speichern einer relativ kleinen Menge von Datenobjekten im Speicher ausgegeben hat. Sehen Sie, dass Sie Ihre Objekte nicht duplizieren. Und natürlich, erhöhen Sie die Heap-Größe:

java -Xmx512M (oder was auch immer Sie für notwendig erachten)

3

Wenn Sie alle Daten im Speicher haben müssen, versuchen Caching häufig Objekte erscheinen. Wenn Sie sich beispielsweise Mitarbeiterdaten ansehen und diese alle eine Berufsbezeichnung haben, verwenden Sie eine HashMap, wenn Sie die Daten laden und die bereits gefundenen Stellentitel wiederverwenden. Dadurch kann der von Ihnen verwendete Speicher erheblich reduziert werden.

Bevor Sie irgendetwas unternehmen, sollten Sie einen Profiler verwenden, um zu sehen, wo Speicher verschwendet wird, und um zu überprüfen, ob Dinge, die Garbage Collected sein können, keine Referenzen haben. Auch hier ist String ein gängiges Beispiel. Wenn Sie zum Beispiel die ersten 10 Zeichen einer Zeichenkette mit 2000 Zeichen verwenden und eine Teilzeichenfolge verwendet haben, anstatt eine neue Zeichenfolge zuzuordnen, haben Sie tatsächlich eine Referenz auf ein Zeichen [2000] ] Array, mit zwei Indizes, die auf 0 und 10 zeigen. Wieder ein großer Speicher-Waster.

1

Sie könnten Ihren Code mit einem Profiler ausführen, um zu verstehen, wie und warum der Speicher verbraucht wird. Debuggen Sie Ihren Weg durch die Schleife und beobachten Sie, was instanziiert wird. Es gibt eine beliebige Anzahl von ihnen; JProiler, Java Memory Profiler, siehe die list of profilers here und so weiter.

0

Ich weiß, dass Sie versuchen, die Daten in Vektor zu lesen - sonst, wenn Sie versuchen, sie anzuzeigen, hätte ich vorgeschlagen, Sie verwenden NatTable. Es wurde entwickelt, um große Datenmengen in einer Tabelle zu lesen.

Ich glaube, dass es für einen anderen Leser hier nützlich sein könnte.

0

Verwenden Sie eine Speicherabbilddatei. Memory-Mapped-Dateien können grundsätzlich so groß werden, wie Sie möchten, ohne den Heap zu treffen. Es erfordert, dass Sie Ihre Daten dekodierfreundlich codieren. (Wie wäre es sinnvoll, eine feste Größe für jede Zeile in Ihren Daten zu reservieren, um schnell eine Reihe von Zeilen zu überspringen.)

Preon ermöglicht Ihnen, damit leicht umzugehen. Es ist ein Framework, das auf binär codierte Daten abzielt, was Hibernate für relationale Datenbanken und JAXB/XStream/XmlBeans für XML getan hat.

Verwandte Themen