Portal > Foren > Java > Desktop-Applikationen und Grafik > Hilfe, Heap Speicher zu voll...
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 20.07.2005, 08:52 Nach oben    #1
matt
Gast
 
Beiträge: n/a
Standard Hilfe, Heap Speicher zu voll...

Hallo!
Ich habe gerade ein gewaltiges Problem: ICh mache ein Programm, dass eine gewaltige Hexkarte darstellt. Dies ist über eine Linked List gelöst, die in jeweils vier Richtungen verweist. Das Problem das ich nun allerdings habe ist, dass diese Hexkarte eine größe von über 1000 x 1000 feldern haben soll. Allerdings bekomme ich schon bei 100x100 ernste probleme mit dem Speicherplatz.
Diese Karte ist allerdings nur für das Anzeigen gedacht, also ist es egal, ob das was nicht am bildschirm ist (da passen ungefähr 40x80 von diesen Hexfeldern darauf) geladen ist oder nicht. Das problem ist nur, dass ich ja nicht alles, was nicht am Bildschirm ist, auf die Festplatte lagern kann - das würde ja zu lange zum scrollen dauern, oder?
Hat jemand eine idee wie man das Problem lösen könnte?
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.07.2005, 20:31 Nach oben    #2
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 582
Standard

Ich habe ein ähnliches Problem unter J2ME gehabt, Handys haben nie besonders viel Heap (es sei denn man kommt gleich mit s60v2 Kanonen *g*)
Ich habe das damals so gelöst, dass ich einfach nur die Bilder im Speicher halte die wirklich angezeigt werden, + 2 oder 3 Felder über den Bildschirmrand hinaus. Scrollt man dann wird die nächste Reihe nachgeladen. Dadurch, dass ja bereits einige Feldreihen mehr schon im Speicher sind fällt das nachladen nicht auf.
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.08.2005, 21:20 Nach oben    #3
final_guy
Gast
 
Beiträge: n/a
Standard

Moin,
bin neu hier und frage nur mal so aus Interesse (ist also leider keine Idee, dich dich weiterbringen wird

Warum benutzt Du eine Liste und kein Array? Ist das nicht ein recht großer Haufen Referenzen, der da im Speicher gehalten wird? und die Zugriffszeit bei Arrays ist doch auch deutlich besser als bei Listen. Frage nur, um heraus zu bekommen, welche Gedanken sich andere so beim hacken machen.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.08.2005, 19:31 Nach oben    #4
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

Also so wie ich das sehe, kann er für die Speicherung eines HEX-Wertes bestenfalls ein String-Objekt oder ähnliche Objekte nehmen.
Also ist es doch egal, ob er eine Liste oder ein Array nimmt. Die Anzahl der Referenzen dürfte sich doch eigentlich nicht großartig unterscheiden.

Zu deinem Problem matt:
Ich hatte mal ähnliches Problem bei einem Programm. Dort konnte ich das aber durch einfache Griffe wie z.B. ersetzen von verschiedenen Datentypen durch andere, also z.B. String durch StringBuffer usw. lösen.
Vielleicht findest du ja auch eine möglichkeit. Wie wäre es denn, wenn du den Hexwert in eine Dezimalzahl umwandelst und dann in einem Array, wie final_guy schon sagte, abspeicherst?
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.08.2005, 19:48 Nach oben    #5
final_guy
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Hot-Thunder
Also so wie ich das sehe, kann er für die Speicherung eines HEX-Wertes bestenfalls ein String-Objekt oder ähnliche Objekte nehmen.
Also ist es doch egal, ob er eine Liste oder ein Array nimmt. Die Anzahl der Referenzen dürfte sich doch eigentlich nicht großartig unterscheiden.
Moin,
ich glaube zwar, das es nicht hierher gehört (sondern eher in einen theoretischen Bereich, wenn es hier so einen geben würde), aber ich möchte nur schnell klar machen was ich meinte, denn ich wurde offenbar falsch verstanden.
Bei einem Array (egal welchen Datentyps) handelt es sich doch um eine quasi direkte Map in den Speicher. Daher eine konstante Zugriffszeit bei den Operationen und nur eine Referenz + Offset. Bei einer Liste, in der jedes Element vier Nachbarn hat, kommt zu dem Datenteil jedes Elements noch je eine Referenz auf jeden der Nachbarn hinzu. Daher ist der Speicherbedarf (in diesem konkreten Fall) eindeutig größer als bei der Verwendung eines entsprechenden Arrays.

Man erkauft sich diese Platz- und Zeitersparnis jedoch durch eine unflexible Struktur. Das sollte aber bei einer Map fester größe kein Thema sein.

Korrigiert mich bzw. widersprecht mir gerne, wenn ihr anderer Meinung seid oder ich da falsch gedacht habe.

Gruß final_guy

[edit]
Kleine Überschlagsrechnung: Wenn man vier Byte pro Adressreferenz annimmt (32bit-Architektur), dann hat jedes Listenelement min. 16Byte an Referenzdaten gespeichert. Bei 1000x1000 = 10^6 Elementen ergibt das grob 16*10^6 Byte = 16MB.

Na ja, ist auch nicht die Welt, aber immerhin.

Ich bin mir aber nicht ganz sicher, wie groß Java-Object Referenzen sind. Bin daher vom virtuellen Speicher ausgegangen.
[/edit]
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.08.2005, 00:44 Nach oben    #6
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 432
Standard

@Final_guy: Ist das auch bei Java so? Ich dachte, da wird alles als Referenz behandelt, selbst arrays. Ich hätte jetzt nicht gedacht, dass das da so ins Gewicht fällt.

Zum Problem: Hast Du Dir schon mal überlegt, ob man die Daten geschickt codieren könnte um somit den Speicherbedarf zu verringern?
__________________
Denk mal darüber nach...

Lars

ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen.
www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de
Sym ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.08.2005, 09:04 Nach oben    #7
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Zitat:
Bei einer Liste, in der jedes Element vier Nachbarn hat, kommt zu dem Datenteil jedes Elements noch je eine Referenz auf jeden der Nachbarn hinzu. Daher ist der Speicherbedarf (in diesem konkreten Fall) eindeutig größer als bei der Verwendung eines entsprechenden Arrays.
Der Teil ist schonmal falsch.
In der rt.jar gibt es mehrere "List"-Implementationen. Die, die du ansprichst, ist die "LinkedList". Es gibt darüber hinaus aber auch noch die "ArrayList", die intern ein Array verwendet.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.08.2005, 10:39 Nach oben    #8
final_guy
Gast
 
Beiträge: n/a
Standard

Moin pago,
na ja, eigentlich reden wir ja gerade über eine LinkedList, denn die wurde ja ursprünglich von matt verwendet. Und auch wenn die von Dir angesprochene java.util.ArrayList intern ein Array verwendet, dann ist sie halt im eigentlichen Sinne keine Liste sondern eben ein Array, dass nur von außen aussieht wie eine Liste und das bei Hinzufügen von Elementen stets komplett vergrößert wird.

Es geht doch um die grundlegende Eigenschaft von Listen, dass sie in jedem Element mindestens eine Referenz auf einen Nachfolger besitzen müssen. Und je dichter die Verkettung ist, desto mehr Referenzen müssen gespeichert werden.

Meine Kernaussage wollte daher lauten, dass Arrays diesen Datenoffset nicht brauchen und daher schneller und kleiner sind wohingegen Listen zwar Langsamer und geringfügig größer sind aber dafür weitaus flexibler.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.08.2005, 11:38 Nach oben    #9
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Ich werde jetzt auch einen Einspruch verzichten, da deine "Kernaussage" wohl richtig ist.

Generell gilt in Java ja folgendes:
Statische Menge an Elementen: Array
Dynamische Menge an Elementen: ArrayList

Eine LinkedList wird immer dann verwendet, wenn die Liste wirklich extrem dynamisch ist, d.h. ständig Elemente hinzugefügt und entfernt werden.
Eine ArrayList wird immer dann verwendet, wenn es primär um das auslesen der Elemente geht, d.h. nicht andauernd dinge wie "list.remove(3); list.add(new Dingsda());" gemacht werden.
Laut Java Tutorial ist die ArrayList die Liste, die in den meisten Fällen verwendet werden sollte.
Eine ArrayList ist nur minimal größer als ein Array und der Zugriff ist beinahe identisch.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.08.2005, 21:01 Nach oben    #10
matt
Gast
 
Beiträge: n/a
Standard

also mal um ein bisschen klarheit zu schaffen. Es handelt sich nicht um hex werte die gespeichert werden soll, sondern ein spielfeld mit sechseckigen Feldern

Was der vorteil von einem Array ist ist schnell gesagt: Diese Liste soll sich in alle Richtungen beliebig ausdehnen können - und das sehr dynamisch.

Das Problem bei Arrays ist, dass man ihre größe nachträglich nicht mehr verändern kann. Das bedeuted, will man hinten was anhängen, muss man ein neues array erstellen, dass größer ist und die daten in das neue Array kopieren. Will man hingegen vorne was anhängen muss man ein neues Array erstellen, das größer ist, und die daten in das neue kopieren - an einen anderen platz damit vorne etwas frei ist.

Arrays haben natürlich den Vorteil, dass sie praktisch sind, wenn man direkt addressierbare Daten verwendet - wenn man also weiss: zuerst benötigt man den 4 eintrag, dann den 6 oder so. Wenn man allerdings alle einträge der Reihe nach benötigt bzw. alle einträge die um einen Eintrag herum liegen ist eine LinkedList schon sehr viel praktischer. Wenn man dann Datenstrukturen wie Stacks oder Queues verwendet, ist es dann auch tausendmal besser, eine linked list zu verwenden, anstelle eines arrays.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.08.2005, 14:39 Nach oben    #11
final_guy
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von matt
also mal um ein bisschen klarheit zu schaffen. Es handelt sich nicht um hex werte die gespeichert werden soll, sondern ein spielfeld mit sechseckigen Feldern
Das war soweit klar. Aber es ist immer gut zu klären, ob man überdie gleiche Sache spricht

Zitat:
Zitat von matt
Was der Vorteil von einem Array ist ist schnell gesagt: Diese Liste soll sich in alle Richtungen beliebig ausdehnen können - und das sehr dynamisch.
Hier meinst Du wahrscheinlich den Vorteil der Liste und bist nur durcheinander gekommen, oder?

Zitat:
Zitat von matt
Das Problem bei Arrays ist, dass man ihre größe nachträglich nicht mehr verändern kann. Das bedeuted, will man hinten was anhängen, muss man ein neues array erstellen, dass größer ist und die daten in das neue Array kopieren. Will man hingegen vorne was anhängen muss man ein neues Array erstellen, das größer ist, und die daten in das neue kopieren - an einen anderen platz damit vorne etwas frei ist.
Jupp, noch einmal in einfachen Worten das Konzept eines Arrays wiedergegeben.

Zitat:
Zitat von matt
Arrays haben natürlich den Vorteil, dass sie praktisch sind, wenn man direkt addressierbare Daten verwendet - wenn man also weiss: zuerst benötigt man den 4 eintrag, dann den 6 oder so. Wenn man allerdings alle einträge der Reihe nach benötigt bzw. alle Einträge die um einen Eintrag herum liegen ist eine LinkedList schon sehr viel praktischer.
Da Thema mit dem direkten Speicherzugriff hatten wir ja schon angesprochen. Was die Komplexität des Zugriffs angeht, so könntest Du auch einfach ein zweidimensionales Array verwenden und hättest damit mMn einen mindestens ebenso intuitiven Zugriff auf die Felder des Spielfelds.

Zitat:
Zitat von matt
Wenn man dann Datenstrukturen wie Stacks oder Queues verwendet, ist es dann auch tausendmal besser, eine linked list zu verwenden, anstelle eines arrays.
Das zieht auch (hoffentlich) keiner in Zweifel.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.08.2005, 14:43 Nach oben    #12
final_guy
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von pago
Eine ArrayList ist nur minimal größer als ein Array und der Zugriff ist beinahe identisch.
Ist ja auch logisch, da ja wie Du selbst sagtest, die ArrayList intern ein Array ist. Das reimt sich sogar.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.09.2005, 14:49 Nach oben    #13
koneo
Gast
 
Beiträge: n/a
Standard

matt:

Wieso benutzt du eine Karte mit sechseckigen Feldern? Wenn du in 4 Richtungen scrollen willst, reichen da nicht viereckige Felder? Bei sechseckigen Feldern wird beim Scrollen nach z.B. Norden die Zeile die nach Nordosten und Nordwesten führt übersprungen. Meist sind Karten mit viereckigen Feldern speicherärmer. Was ist für dich so wichtig an sechseckigen Feldern?

Seit Java 1.5 finde ich die ArrayList, wegen ihrer Typsicherheit, sehr interessant. Ihre Größe wächst oder schrumpft dynamisch und ihre Objekte sind direkt ansprechbar. Ob sie beim Scrollen zu lange braucht steht in der javadoc:
Zitat:
Javadoc -> ArrayList:

"[...] The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add operation runs in amortized constant time, that is, adding n elements requires O(n) time. All of the other operations run in linear time (roughly speaking). The constant factor is low compared to that for the LinkedList implementation. [...] The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost. [...]"
Deshalb denke ich, dass ein sauberes Scrollen ohne Zwischenspeichern funktionieren könnte.

Bitte schreibe mir, was du davon hälst.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ich brauche Hilfe bei der Administration meines rootservers! Firat Plauderecke 7 07.09.2007 07:40
Suche Hilfe für eine Portalseite bl-25 PHP-Programmierung 36 29.05.2007 15:57
excel hilfe -> blattname robo47 Gesuche 3 12.06.2006 11:08
Java braucht unsere Hilfe Ben Interessante Diskussionsthemen 3 04.06.2006 21:20
Speicher für die VM ändern Gottzilla Allgemeine Java-Programmierung 5 05.04.2005 18:06


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45