<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Speichersparend verindexen statt verpointern]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich will eine Triangulierung, also sowas:</p>
<p><a href="http://img705.imageshack.us/img705/6662/debug2.gif" rel="nofollow">http://img705.imageshack.us/img705/6662/debug2.gif</a></p>
<p>speichereffizient und schnell für mehrere Mio. Punkte implementieren.</p>
<p>Ansatz 1: Die Dreiecke und Punkte werden am Heap erzeugt und jedes Dreieck<br />
speichert Pointer auf die 3 Eckpunkte und die 3 Nachbardreiecke, also 6 Pointer<br />
a' 8 Bytes pro Dreieck auf einer 64bit-Maschine.</p>
<p>Ansatz 2: Die Dreiecke und Punkte liegen in Arrays, und jedes Dreieck speichert<br />
nur Indizes auf seine Eckpunkte und Nachbardreiecke, also 6 Integer a' 4 Bytes,<br />
auch auf 64bit-Maschinen.</p>
<p>Ansatz 1 ist teuer bezüglich Speicherkonsum. Ansatz 2 ist deutlich billiger,<br />
aber auch langsamer. Fällt Euch was besseres als Ansatz 2 ein? Wichtig ist,<br />
daß der Zugriff verdammt schnell geht, da diese Informationen häufig abgefragt<br />
oder geändert werden.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257156/speichersparend-verindexen-statt-verpointern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 11:11:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257156.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Dec 2009 20:46:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Wed, 23 Dec 2009 20:46:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich will eine Triangulierung, also sowas:</p>
<p><a href="http://img705.imageshack.us/img705/6662/debug2.gif" rel="nofollow">http://img705.imageshack.us/img705/6662/debug2.gif</a></p>
<p>speichereffizient und schnell für mehrere Mio. Punkte implementieren.</p>
<p>Ansatz 1: Die Dreiecke und Punkte werden am Heap erzeugt und jedes Dreieck<br />
speichert Pointer auf die 3 Eckpunkte und die 3 Nachbardreiecke, also 6 Pointer<br />
a' 8 Bytes pro Dreieck auf einer 64bit-Maschine.</p>
<p>Ansatz 2: Die Dreiecke und Punkte liegen in Arrays, und jedes Dreieck speichert<br />
nur Indizes auf seine Eckpunkte und Nachbardreiecke, also 6 Integer a' 4 Bytes,<br />
auch auf 64bit-Maschinen.</p>
<p>Ansatz 1 ist teuer bezüglich Speicherkonsum. Ansatz 2 ist deutlich billiger,<br />
aber auch langsamer. Fällt Euch was besseres als Ansatz 2 ein? Wichtig ist,<br />
daß der Zugriff verdammt schnell geht, da diese Informationen häufig abgefragt<br />
oder geändert werden.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827014</guid><dc:creator><![CDATA[bts2]]></dc:creator><pubDate>Wed, 23 Dec 2009 20:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Wed, 23 Dec 2009 23:05:25 GMT]]></title><description><![CDATA[<p>Ich denke, dass es auf die Art des Zugriffes ankommt, den du machst. Wie sieht denn das übeliche Zugriffszenario aus? Ändern an benachbarten Dreiecken, oder wild herum?</p>
<p>Ich persönlich würde mal zu Ansastz 1 tendieren, bis ich merke, dass der Speicher wirklich ausschlaggebend wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827066</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 23 Dec 2009 23:05:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Wed, 23 Dec 2009 23:31:04 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich denke, dass es auf die Art des Zugriffes ankommt, den du machst. Wie sieht denn das übeliche Zugriffszenario aus? Ändern an benachbarten Dreiecken, oder wild herum?</p>
<p>Ich persönlich würde mal zu Ansastz 1 tendieren, bis ich merke, dass der Speicher wirklich ausschlaggebend wird.</p>
</blockquote>
<p>Alle Operationen arbeiten ausschließlich mit den genannten Nachbarschafts-<br />
beziehungen, also lokal in zusammenhängenden Gebieten. Daher müssen diese<br />
Nachbarschaftsbeziehungen schnell sein. Speicher ist wegen großer Daten-<br />
mangen ausschlaggebend, daher habe ich Ansatz 2 eingeführt. Mir fällt nix<br />
mehr ein, aber vielleicht gibts noch einen Ansatz 3, der besser ist?</p>
<p>lg :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827083</guid><dc:creator><![CDATA[bts2]]></dc:creator><pubDate>Wed, 23 Dec 2009 23:31:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Thu, 24 Dec 2009 00:27:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Wichtig ist, daß der Zugriff verdammt schnell geht, da diese Informationen häufig abgefragt oder geändert werden.</p>
</blockquote>
<p>Das sagt absolut ueberhaupt nichts aus. Zu welchem Zweck werden Nachbarschaftsinformationen wie abgefragt? Um wieviel MByte an Daten geht es? (mehrere Millionen Dreiecke ergeben 8 MByte?)Welche Operationen? etc. etc. ... Ansaetze sind vielleicht double connected edge list oder trapezoidal map. Aber normalerweise tauscht man Speicher gegen Geschwindigkeit, beides geht meist nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827102</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 24 Dec 2009 00:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Thu, 24 Dec 2009 01:21:43 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Wichtig ist, daß der Zugriff verdammt schnell geht, da diese Informationen häufig abgefragt oder geändert werden.</p>
</blockquote>
<p>Das sagt absolut ueberhaupt nichts aus. Zu welchem Zweck werden Nachbarschaftsinformationen wie abgefragt? Um wieviel MByte an Daten geht es? (mehrere Millionen Dreiecke ergeben 8 MByte?)Welche Operationen? etc. etc. ... Ansaetze sind vielleicht double connected edge list oder trapezoidal map. Aber normalerweise tauscht man Speicher gegen Geschwindigkeit, beides geht meist nicht.</p>
</blockquote>
<p>1 Mio. Punkte ergeben 2 Mio Dreiecke, und alleine die Nachbarschaftsbeziehungen<br />
dafür kosten nach dem ersten Ansatz 6 * 8 * 2000000 = 96 MB. Die Nachbarschaften<br />
werden abgefragt, um zusammenhängende Zonen mit bestimmten Eigenschaften zu<br />
finden. DCEL ist eine Überlegung wert, muß mal überlegen, ob das in mein Konzept<br />
geht, danke.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827118</guid><dc:creator><![CDATA[bts2]]></dc:creator><pubDate>Thu, 24 Dec 2009 01:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Thu, 24 Dec 2009 02:01:51 GMT]]></title><description><![CDATA[<p>Ich denke auch dass Ansatz 2 besser sein wird.<br />
Nicht nur was Speicherverbrauch angeht, sondern u.U. auch was die Geschwindigkeit angeht.<br />
Zig Millionen kleine Speicheranforderungen sind nicht gerade billig...</p>
<p>Ansatz 2 wird nur dann lästig, wenn man mal Dreiecke und/oder Punkte löschen will. Dann muss man entweder alle Indizes anpassen (laaaaaaaangsam), oder die Dreiecke/Punkte nicht wirklich löschen, sondern einfach den Platz im Array unbenutzt lassen. Ggf. kann man auch eine eigene Free-List programmieren, in der man Indizes von unbenutzten Dreiecken/Punkten zur Wiederverwendung abspeichert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827124</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 24 Dec 2009 02:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Thu, 24 Dec 2009 08:50:59 GMT]]></title><description><![CDATA[<p>Was spricht gegen Ansatz 2, wobei die Arrays in Blöcken auf dem Heap erzeugt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827162</guid><dc:creator><![CDATA[Pappnase]]></dc:creator><pubDate>Thu, 24 Dec 2009 08:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Thu, 24 Dec 2009 10:09:15 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Zig Millionen kleine Speicheranforderungen sind nicht gerade billig...</p>
</blockquote>
<p>Für sowas verwendet doch man einen Pool! Selbst implementiert oder einen fertigen.</p>
<p>z.B.</p>
<pre><code class="language-cpp">unsigned int size = /* Vorausberechnete Größe oder geschätzt anhand ein paar Parameter */;

void *raw = operator::new(size);
// Oder void *raw = malloc(size);

Dreieck *rawD = (Dreieck*) raw;

Dreieck *p = new (rawD) Dreieck(10,1,25);
rawD++; // Vorsicht vor überlauf!
</code></pre>
<p>[cpp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827181</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Thu, 24 Dec 2009 10:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speichersparend verindexen statt verpointern on Fri, 25 Dec 2009 03:12:15 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Zig Millionen kleine Speicheranforderungen sind nicht gerade billig...</p>
</blockquote>
<p>Für sowas verwendet doch man einen Pool! Selbst implementiert oder einen fertigen.</p>
</blockquote>
<p>Ja kann man. Ich finde die Variante mit einem Array (std::vector) trotzdem besser.<br />
Ist denke ich inetwa gleich viel Aufwand. Vom Speicherverbrauch mal abgesehen würde ich sagen ist es einfach Geschmackssache.</p>
<p>BTW: den grössten Geschwindigkeitsgewinn würde es hier wohl bringen, wenn man die Dreiecke/Punkte Cache-freundlich arrangieren könnte. Wenn man das Zugriffsmuster kennt, und daraus eine günstige Anordnung ableiten kann, kann man das mit einem Array ganz einfach umsetzen. Mit einem Allokator (egal ob Pool oder sonstwas) ginge das nur, wenn man auch den Allokator kontrolliert. Und man schafft dadurch eine zusätzliche Abhängigkeit: wenn der Allokator geändert wird, kann es sein, dass die Anordnung auf einmal garnichtmehr Cache-freundlich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827554</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 25 Dec 2009 03:12:15 GMT</pubDate></item></channel></rss>