Vermeiden Sie ein "out of memory Fehler" in Java(eclipse), bei der Verwendung von großen Daten-Struktur?
OK, also Schreibe ich ein Programm, dass leider verwenden muss, die von einem riesigen Daten-Struktur, um seine Arbeit abzuschließen, aber es nicht mit einem "out of memory "- Fehlermeldung" bei der Initialisierung. Ich verstehe zwar vollkommen, was das bedeutet und warum es ein problem ist, ich habe Schwierigkeiten zu überwinden, da mein Programm nutzen muss, diese große Struktur, und ich kenne keinen anderen Weg, um es zu speichern.
Erst das Programm Indizes einen großen Korpus von text-Dateien, die ich bereitstellen. Dies funktioniert sehr gut.
Dann wird dieses index zu initialisieren, einem großen 2D-array. Dieses array wird n2 Einträge, wo "n" ist die Anzahl der eindeutigen Wörter im Korpus von text. Für ein relativ kleines Stück, ich Teste es o n(über 60 Dateien), die es braucht, um ungefähr 30,000x30,000 Einträge. Dies wird wahrscheinlich größer sein, sobald ich es auf meine volle beabsichtigten corpus zu.
Es wiederholt nicht jedes mal, nachdem Sie Indizes während der Initialisierung der Datenstruktur(daran gearbeitet werden, später).
Dinge, die ich getan habe sind:
- umzukrempeln, meinen code zu verwenden, eine primitive
int[]
statt einerTreeMap
- redundante Strukturen, etc...
- Auch, ich habe das Programm mit
-Xmx2g
max aus meinen reservierten Speicher
Ich bin ziemlich zuversichtlich, dass dies nicht eine einfache Zeile von code-Lösung, aber ist wahrscheinlich zu verlangen, dass ein sehr neuer Ansatz. Ich bin auf der Suche nach was, dass der Ansatz, irgendwelche Ideen?
Dank,
B.
- Beachten Sie, dass der Start von Eclipse mit diesen Argumenten ist nicht zu helfen, es sei denn, dein code ist ein Eclipse-plugin. Wenn Sie nur mit Eclipse als IDE, dann müssen Sie ändern, um die Konfiguration auszuführen, die von Ihrer Anwendung, nicht auf den Start von Eclipse.
- AH, danke Joachim. Ich habe nicht lief separat und es gibt mir immer noch den selben Fehler(obwohl es viel länger dauert, um dorthin zu gelangen, ich glaube, das ist eine Verbesserung)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie (machen einige Annahmen über das, was Sie mit Ihrem array für) die meisten Einträge auf 0. Wenn ja, könnten Sie erwägen, einen sparse matrix Darstellung.
Wenn Sie wirklich haben, dass viele Einträge (Ihre aktuelle array ist irgendwo über 3 Gigabyte schon, selbst dann, wenn kein overhead), dann müssen Sie irgendeine Art von on-disk-Speicher, oder eine lazy-load - /unload-system.
Gibt es mehrere Ursachen von out-of-memory-Probleme.
Zunächst der einfachste Fall ist, Sie brauchen einfach mehr heap. Sie sind mit 512M max-heap, wenn das Programm konnte ordnungsgemäß mit 2G. Anstieg ist mit
-Xmx2048m
als JVM option, und Sie sind in Ordnung. Auch bewusst sein, als 64-bit-VMs verwenden, die bis zu den doppelten Arbeitsspeicher der 32-bit-VMs je nach make-up der Daten.Wenn Ihr problem ist nicht, dass einfach dann kannst du schauen-Optimierung. Ersetzen von Objekten mit primitiven und so weiter. Dies könnte eine option sein. Ich kann nicht wirklich sagen, basierend auf dem was du gepostet hast.
Letztlich aber kommen Sie an eine Kreuzung, wo Sie haben, eine Wahl zu treffen zwischen virtulization und Partitionierung.
Virtualisierung in diesem Zusammenhang bedeutet einfach eine form der Selbsttäuschung, es ist mehr Speicher, als es ist. Betriebssysteme mit virtuellen Adressräume und die Verwendung von Speicherplatz auf der Festplatte als zusätzlichen Speicher. Dies könnte bedeuten, nur halten Sie einige der Datenstruktur im Speicher und die anhaltende Erholung in den sekundären Speicher (z.B. Datei oder Datenbank).
Partitionierung ist das aufteilen der Daten auf mehrere Server (entweder real oder virtuell). Zum Beispiel, wenn Sie wurden verfolgen der Aktienhandel an der NASDAQ könnte man codes beginnend mit "A" auf "server1", "B" auf "server2", etc. Sie müssen zu einem angemessenen Ansatz für die Scheibe Ihre Daten, so dass Sie verringern oder beseitigen die Notwendigkeit für cross-Kommunikation, weil die übergreifende Kommunikation ist das, was die Grenzen deiner Skalierbarkeit.
So einfachen Fall, wenn das, was Sie sind die Speicherung ist 30K Wörter und 30K x 30K Kombinationen von Wörtern könnten Sie teilen es in vier server:
Das ist nur eine Idee. Wieder ist es schwer toc omment, ohne zu wissen, Besonderheiten.
Dies ist ein häufiges problem im Umgang mit großen Datenmengen. Optimieren Sie so viel wie Sie wollen, aber die Erinnerung wird nie genug sein (wahrscheinlich), und sobald der Datenbestand wächst ein wenig mehr sind Sie immer noch rauchte. Die skalierbare Lösung ist einfach zu halten, weniger zur Erinnerung, die Arbeit an Stücken, und speichern Sie die Struktur auf der Festplatte (Datenbank/Datei).
Wenn Sie nicht brauchen eine vollständige 32-bit (Größe des integer) für jeden Wert in deinem 2D-array, vielleicht ein kleiner Typ, wie ein byte würde den trick tun? Auch sollten Sie darauf verzichten, wie viel heap-Speicher wie möglich - 2GB ist noch relativ klein für ein modernes system. RAM ist Billig, vor allem wenn Sie erwarten, zu tun, eine Menge der Verarbeitung im Speicher.