realloc wird immer langsamer?
-
Hallo,
kann es sein, dass realloc mit der größe des vom Programm verwendeten Speichers unter Linux immer langsamer wird?
Ich habe diverse arrays, die eine ähnliche größe haben, aber ab ca. 8Gb wird der realloc ziemlich langsam. Es sind 132Gb RAM verbaut, daran dürfte es nicht liegen.
Die arrays werden nacheinander reallokiert und nicht parallel.Wenn ich nun ein Array hätte, dass immer größer wird, könnte ich das verstehen. Es sind aber verschiedene.
Natürlich könnte es auch ein anderes Problem sein, aber wenn ich das schonmal ausschließen könnte wäre das schonmal gut.
-
Poste bitte ein minimales Beispiel!
-
Kommt drauf an, was genau du mit "ziemlich langsam" meinst. Speicheranforderungen (sofern genügend physikalischer Speicher vorhanden ist) können aufgrund von zwei Effekten langsamer werden:
-einfach, weil du viel Speicher anforderst, was minimal länger dauert, wenn es viel ist.
-wenn du es so anstellst, dass tatsächlich dauernd kopiert werden muss, anstatt einfach das vorhandene Feld zu erweitern. 8GB zu kopieren dauert schon einen Moment.Ich tippe auf eine schlechte Reallokationsstrategie, so dass der zweite Fall häufig eintritt und/oder etwas ganz anderes, das mit realloc gar nichts zu tun hat.
-
Es wird an sich versucht mehrere Objekte der gleichen Klasse (mit anderen Werten) zu verwenden. Dabei wird recht viel Speicher allokiert.
Alle einzeln laufen etwa gleich schnell. Wenn ich sie alle laufen lasse, benötigen -meiner Meinung nach- die realloc's sehr viel Zeit.
Dabei wird das Programm nach den ersten paar Objekten extrem langsam.**Ist es möglich, dass die realloc's mehr Zeit benötigen, wenn der Prozess bereits viel Speicher belegt? Weil es wird ja nur mehrmals das gleiche gemacht.
Die Auskunft würde mir schon sehr helfen.**
Der code stammt nicht von mir, etwas beschleunigen konnte ich bereits indem ich immer größere Blöcke auf einmal allokiere. Werd das auch noch lösen. Mich wundert nur, dass er immer langsamer wird, obwohl eigentlich x mal das gleiche gemacht wird und die Arrays unabhängig voneinander sein !sollten!. Sind ja schließlich in einem anderen Objekt.
Das Programm läuft unter Linux. Könnte das am Speichermanagement liegen?
Werd das nach und nach mit vector ersetzen, bin nicht so der c Programmierer und hatte mit malloc realloc noch nicht so viel zu tun.
-
allocinator schrieb:
Es wird an sich versucht mehrere Objekte der gleichen Klasse (mit anderen Werten) zu verwenden. Dabei wird recht viel Speicher allokiert.
Klassen und malloc? Klingt nach C++ gemischt mit C. Ich hoffe, du weißt, was du tust und wann malloc für Klassen in Ordnung ist.
Alle einzeln laufen etwa gleich schnell. Wenn ich sie alle laufen lasse, benötigen -meiner Meinung nach- die realloc's sehr viel Zeit.
Was heißt hier Meinung? Woher kommt die Meinung? Miss doch nach! Stichwort: Profiler.
**Ist es möglich, dass die realloc's mehr Zeit benötigen, wenn der Prozess bereits viel Speicher belegt? Weil es wird ja nur mehrmals das gleiche gemacht.
**Du stellst die Frage ungeschickt. Programmierer sagen ungerne, dass etwas unmöglich ist, wenn irgendein Szenario vorstellbar wäre, bei dem es doch möglich ist. Was würde dir solch eine Auskunft nützen? Die Frage ist schließlich, warum dein Programm langsam ist, nicht, ob realloc langsam werden kann. Aber wie ich schon sagte, sind solche Szenarien denkbar. Möglicherweise liegt eines davon vor. Mögliche Faktoren:
-Die Speicherblöcke sind so ungünstig fragmentiert, dass dauernd neu allokiert werden muss
-Das Programm hat eine ungünstige Reallokationsstrategie und ruft daher realloc unnötig oft auf
-Reallokieren eines großen Blocks ist nun einmal langsam, aber das lässt sich nicht vermeiden. Man kann aber vermeiden, dass überhaupt reallokiert werden muss.Könnte das am Speichermanagement liegen?
Für diese Frage gilt das gleiche wie oben. Natürlich könnte es daran liegen. Wir wissen überhaupt gar nichts über dein Programm, außer welche Vermutungen du hast. Wenn du fragen würdest, ob es an statischer Ladung im Resetschalter liegen könnte, würden wir auch "Ja" antworten.
Der code stammt nicht von mir, etwas beschleunigen konnte ich bereits indem ich immer größere Blöcke auf einmal allokiere.
Wenn der Code das nicht von vornherein so gemacht hat, dann ist das ein schlechtes Zeichen. Mit der gegebenen, spärlichen Information würde ich auf einen schlechten Algorithmus oder Fehler in der Umsetzung tippen. Möglicherweise im Zusammenhang mit der realloc-Nutzung, möglicherweise nicht.
Werd das nach und nach mit vector ersetzen, bin nicht so der c Programmierer und hatte mit malloc realloc noch nicht so viel zu tun.
Sei dir im Klaren, dass der vector immer reallokiert, wenn seine Capacity nicht ausreicht. Eine Umsetzung, die ihre Capacity einfach so erhöht (also wie realloc ohne Reallokation) ist zwar vorstellbar, existiert meines Wissens nach aber nicht. Aber der vector sollte dafür eine clevere Allokationsstrategie fahren, so dass dieser Fall selten eintritt.