Aufgabe 2 - Speicherverbrauch

…ich hab doch nur 700MB Ram…

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 2 - Speicherverbrauch
bei der Sortiereingabe von wlist5 (~8MB) steigt der Speicherverbrauch meines Programms auf ~240 MB - vermutlich wegen der Fragmentierung durch die viellen reallocates.

Ist das bei Euch auch so?


allokierst du vielleicht für jedes der 675673 Wörter 100 Bytes? Dann wären wir immerhin schon bei 64 MB dafür :wink:


wär ganz nett, wenn du vielleicht gleich noch nen lösungsvorschlag posten würdest, wie man das anderes machen kann :wink:


???

man allokiert doch zunächst einmal speicher für eine imaginäre Liste … wenn man dann Daten einliest, muss man nochmal für jedes Wort Speicher allokieren und dabei kann man doch wohl vorher zählen wieviel Bytes man so braucht, nicht? Und wenn die Liste nicht mehr ausreicht einfach noch ein wenig mehr speicher der liste geben …

kurz (pseudo):

liste=malloc()
while ende nicht erreicht {
liste(i) = malloc(len(wort))
if liste zu klein liste=realloc()}

einlesen fertig …

natürlich gibt es da noch kreativere Ansätze mit verketteten Listen, etc g


Ja. Danke für die Antwort. Das ist eine gute Idee. Ändern werde ich mein Prog dennoch nicht :wink:

einfacher Code → weniger Fehler → mehr Punkte :wink:


häää?

ineffizienter einfacher code is mehr wert als effizienter komplizierter code?

das wag ich ja mal zu bezweifeln :gun:


weniger potentielle Fehler


Mal 'ne dumme Frage. Wie kann ich mir denn den verbrauchten Speicher anzeigen lassen?


linux: top

windows: taskmanager


als ich die Aufgabe letztes Jahr abgegeben habe, habe ich auch die Holzhammermethode gewählt … und ich habe den Übungsleiter extra noch gefragt wie das mit dem Speicher sei, ich bräuchte da zwar sehr viel, dafür sei es schnell. Als Antwort kam: “Speicher ist billig”, was mich fortan bei den Übungen begleitete :slight_smile:

(Allerdings war das Musterprogramm ala oben beschrieben, wesentlich flotter) …

Und wegen der Fehler würde ich mir da mal keine Sorgen machen. So lange das Programm, das tut was es soll und nicht andauernd Segfaults wirft, passt es schon … und kompliziert? Kann man da bei < 50 Zeilen schon von kompliziert reden? :slight_smile:

Grüße,
Sebbi


der qsort erwartet ein zusammenhaengendes Stueck Speicher, das er sortiert.
Da koennen die Woerter selbst drinstehen, dann verbraucht man aber pro Wort die ganzen 100 Zeichen. Es kann allerdings auch was anderes drinstehen.
Wichtig dabei ist nur, dass die “compare” Funktion, die ihr dem qsort als Argument uebergebt auch die Dinge vergleichen kann, die in dem array drinstehen.

Eine Liste scheint mir ein bisschen ungeeignet, da der qsort immer sein array braucht, solange die Lsg allerdings laeuft und das tut was sie soll ist das auch ok.


naja, man könnte es auch so machen, dass es nur den tatsächlichen speicher verbraucht.

Bei mir ist eine Sequenz von Pointern hintereinander gespeichert. Die Comparefunktion dereferenziert dann die Pointer → die Strings sind verglichen.


bei mir sollte das auch so laufen… eine frage, wie mach ich nen cast auf nen zeiger der auf nen zeiger zeigt der auf char zeigt ?? hab (* ). (**) (char *),… versucht …


char **var


ich glaub du meinst (char **), also:

void *bla;
char **blub = (char **) bla;

oder meinst du was anderes?


Oh cast war gefragt.

Ich habe was von deklaration erzählt.


mhm, die wlist5 braucht bei mir im moment 17,5 MB speicher, ist also mehr als das doppelte der datei an sich, mal schaun was ich noch schrauben kann,

mfg Majeeks


wie findet ihr heraus, wieviel speicher euer programm braucht?
kann man da irgendwie etwas nachverfolgen oder muss man parallel top starten und dann hoffen, den peak des verbrauchs zu sehen?


machts dir am besten nach dem einlesen ein scanf damit das programm anhält, und dann schaust dir mit top den speicherverbrauch an