Ich verwende ein Beispiel aus der Finite-Elemente-Theorie, aber jeder, der eine große Datenstruktur unterhält und diese sukzessive erweitert, wird etwas Ähnliches finden.
Angenommen, ich habe ein unstrukturiertes Netz aus Punkten und Dreiecken, wobei die Punkte durch Koordinaten (z. B. und ) gegeben sind und die Dreiecke jeweils aus drei Punktindizes (z. B. , und ) bestehen.y i j k
Wie in FEM üblich, wird das Netz nacheinander verfeinert. Wenn wir auf eine globale regelmäßige Verfeinerung zurückgreifen, wächst die Anzahl der Dreiecke mit jeder Iteration der Verfeinerung um den Faktor . Je nachdem, wie dies gemacht wird, entwickelt sich das Speicherlayout unterschiedlich.
Angenommen, das Netz belegt die Speicherzellen 1 bis 300, alles darüber hinaus ist frei.
Beispiel 1:
Wir weisen den Platz für das neue Netz, die Zellen 301 bis 1501, zu, füllen es mit den Daten des verfeinerten Netzes und vergessen das alte. Das nächste verfeinerte Netz wird in den Zellen 1501 bis 6300 platziert, das nächste in den Zellen 6301 bis 21500 und so weiter. Die Position des aktuellen Netzes wird im Speicher "nach rechts" verschoben, während ein riesiger Patch nicht verwendet wird. Möglicherweise geht uns vorzeitig der Speicher aus.
Man könnte im obigen Beispiel beobachten, dass dies uns nur für einen Verfeinerungsschritt behindert, da uns auch ohne diese Fragmentierung eine Verfeinerung später der gesamte Speicher ausgehen würde. Wenn auch das Scheitelpunktarray berücksichtigt wird, kann das Problem schwerwiegender werden.
Wie kann dies umgangen werden?
Beispiel 2:
Ordnen Sie das Dreiecksarray den Zellen 1..1200 neu zu. Erstellen Sie das neue Netz in den Zellen 1201 bis 2400. Kopieren Sie den Inhalt dieser Arbeitskopie in die Zellen 1..1200 und vergessen Sie die Arbeitskopie. Ähnlich wiederholen.
Ok, wir haben immer noch vorzeitig keinen Speicher mehr, weil wir eine Arbeitskopie benötigen. Wie wäre es damit:
Beispiel 3:
Ordnen Sie das Dreiecksarray den Zellen 1..1500 neu zu. Kopieren Sie das alte Netz nach 1201 .. 1500. Erstellen Sie ein neues Netz in den Zellen 1..1200. Dann vergessen Sie die Kopie des alten Netzes.
Der Fall hier ist künstlich, weil man auf diesen Skalen keine globale Netzverfeinerung verwenden würde. Wenn das Wachstum viel kleiner ist, ist eine Neuausrichtung des Speichers möglich, um eine Fragmentierung zu vermeiden. Jedoch,
Fragen:
Wird die Speicherfragmentierung im praktischen wissenschaftlichen Rechnen / Hochleistungsrechnen jemals kritisch?
Wenn überhaupt, wie vermeidest du das? Vielleicht ist mein Maschinenmodell sogar falsch, und das Betriebssystem richtet den Speicher durch starke Magie stillschweigend neu aus oder verwaltet fragmentierte Blöcke auf dem Heap.
Genauer gesagt, wie wirkt es sich auf das Netzmanagement aus?