<?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[Ideale Speichermethode gesucht]]></title><description><![CDATA[<p>EDIT: Ups wahrscheinlich falsches Forum, vielleicht könnt ihr es mal bitte zur MFC verschieben... sorry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hallo allerseits,</p>
<p>ich muss zugeben, ich bin gerade ein wenig verwirrt von der Vielfalt der Möglichkeiten, Daten in eine Datei zu speichern und kann mich so gar nicht entscheiden, welche Methode ich nun am besten wähle, die da am effizientesten sein kann.</p>
<p>Zu speichern sind bei mir Daten in der Form</p>
<pre><code>long, CByteArray
</code></pre>
<p>Ein CByteArray* wird von einem Objekt an eine die Speicherverwaltung beinhaltende Klasse übergeben. Das Array enthält alle wichtigen Daten. Der Longwert beschreibt die eindeutige ID des Objekts, dass Daten speichern möchte.</p>
<p>Bisher speicher ich alles nur in einer Map. Sozusagen wie in einer Tabelle.</p>
<pre><code class="language-cpp">typedef CTypedPtrMap &lt; CMapWordToOb, long, CByteArray* &gt; CMapLongToCByteArray;
CMapLongToCByteArray m_map;
</code></pre>
<p>Nun ist aber die Aufgabe, dass alles in eine Datei auszulagern. Und es soll jede Änderung sofort in die Datei einfließen. Sprich, die Objekte melden sich bei Wertänderung, schicken ein neues CByteArray und damit muss das alte überschrieben werden. Das Ganze ist für den Fall, falls das Programm oder sogar der Rechner abstürzen, können somit die vormals aktuellen Werte wieder hergestellt werden.</p>
<p>Klar wär dafür eine Datenbank am besten (wird es auch geben und ist wahrscheinlich am sinnvollsten), aber ich hab nun den Auftrag, die Möglichkeit zu schaffen, es auch in eine Datei auszulagern.</p>
<p>Mit Serialisierung hab ich bisher leider keine Erfahrung, daher weiß ich nicht, ob das in der Lage ist, auch Daten nur zu &quot;updaten&quot; oder ob das dann immer die gesamte CMap neu speichern würde. Das wäre dann definitiv zu langsam. Also muss ich mich wohl selbst darum kümmern.</p>
<p>Was denkt ihr, was da am schnellsten sein dürfte? Zeilenweise Ausgabe in einer Textdatei (analog einer Tabelle eben) oder vielleicht doch lieber eine Binärdatei? Ich weiß, dass die Datei höchstwahrscheinlich nach kurzer Zeit stark physisch fragmentiert sein dürfte, aber das ist erstmal nebensächlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174018/ideale-speichermethode-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 12:57:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174018.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Feb 2007 09:31:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 09:34:09 GMT]]></title><description><![CDATA[<p>EDIT: Ups wahrscheinlich falsches Forum, vielleicht könnt ihr es mal bitte zur MFC verschieben... sorry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hallo allerseits,</p>
<p>ich muss zugeben, ich bin gerade ein wenig verwirrt von der Vielfalt der Möglichkeiten, Daten in eine Datei zu speichern und kann mich so gar nicht entscheiden, welche Methode ich nun am besten wähle, die da am effizientesten sein kann.</p>
<p>Zu speichern sind bei mir Daten in der Form</p>
<pre><code>long, CByteArray
</code></pre>
<p>Ein CByteArray* wird von einem Objekt an eine die Speicherverwaltung beinhaltende Klasse übergeben. Das Array enthält alle wichtigen Daten. Der Longwert beschreibt die eindeutige ID des Objekts, dass Daten speichern möchte.</p>
<p>Bisher speicher ich alles nur in einer Map. Sozusagen wie in einer Tabelle.</p>
<pre><code class="language-cpp">typedef CTypedPtrMap &lt; CMapWordToOb, long, CByteArray* &gt; CMapLongToCByteArray;
CMapLongToCByteArray m_map;
</code></pre>
<p>Nun ist aber die Aufgabe, dass alles in eine Datei auszulagern. Und es soll jede Änderung sofort in die Datei einfließen. Sprich, die Objekte melden sich bei Wertänderung, schicken ein neues CByteArray und damit muss das alte überschrieben werden. Das Ganze ist für den Fall, falls das Programm oder sogar der Rechner abstürzen, können somit die vormals aktuellen Werte wieder hergestellt werden.</p>
<p>Klar wär dafür eine Datenbank am besten (wird es auch geben und ist wahrscheinlich am sinnvollsten), aber ich hab nun den Auftrag, die Möglichkeit zu schaffen, es auch in eine Datei auszulagern.</p>
<p>Mit Serialisierung hab ich bisher leider keine Erfahrung, daher weiß ich nicht, ob das in der Lage ist, auch Daten nur zu &quot;updaten&quot; oder ob das dann immer die gesamte CMap neu speichern würde. Das wäre dann definitiv zu langsam. Also muss ich mich wohl selbst darum kümmern.</p>
<p>Was denkt ihr, was da am schnellsten sein dürfte? Zeilenweise Ausgabe in einer Textdatei (analog einer Tabelle eben) oder vielleicht doch lieber eine Binärdatei? Ich weiß, dass die Datei höchstwahrscheinlich nach kurzer Zeit stark physisch fragmentiert sein dürfte, aber das ist erstmal nebensächlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233045</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Thu, 22 Feb 2007 09:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 09:35:10 GMT]]></title><description><![CDATA[<p>Deine Möglichkeiten hängen ganz davon ab, wie sich die Objekte ändern können. Wenn dein CByteArray eine feste Größe hat, könntest du es einfach in der Datei überschreiben (per seekp() an die richtige Position fahren und per write() schreiben), wenn sich die Größe ändern könnte, bleibt dir nichts anderes übrig als die komplette Datei jedes Mal neu zu schreiben (bzw. zumindest alles nach der geänderten Position).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233049</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Feb 2007 09:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 09:51:46 GMT]]></title><description><![CDATA[<p>Tja voraussichtlich wird sich die Größe ändern. Kann man da rein logisch nicht irgendwas einfügen? Kümmert sich dann nicht das BS um den Rest (umkopieren usw)? Was da nun rein physisch auf dem Datenträger passiert, ist mir ja relativ egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233073</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Thu, 22 Feb 2007 09:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 10:18:50 GMT]]></title><description><![CDATA[<p>Wenn du mit fstream-Methoden etwas in eine Datei schreibst, wird deren voriger Inhalt überschrieben - da kannst du physikalisch nichts dazwischenschieben oder zusammendrücken.</p>
<p>Wenn es dir nicht so sehr auf die Dateigröße ankommt, gäbe es noch eine Alternative: Du speicherst zunächst alle Map-Einträge mit fester Größe (jeweils ID, Größe des Arrays und Position des Arrays in der Datei) und danach die einzelnen Arrays (jeweils mit einigen Leerfeldern dahinter). Wenn das Array etwas wächst, kannst du die Leerfelder auffüllen, wenn du dort keinen Platz mehr hast, hängst du es ans Ende der Datei an und passt die Positions-Angabe in ersten Teil an.<br />
(um die Datei nicht ins Uferlose wachsen lassen und mit Mülldaten zu füllen, kannst du in regelmäßigen Abständen die alte Datei wegschmeißen und von Grund auf neu schreiben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233097</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Feb 2007 10:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 10:35:36 GMT]]></title><description><![CDATA[<p>Hm ich hatte gedacht, dass sowas das BS selbst verwalten könnte. Dort können ja physisch auch Dateien fragmentiert sein, obwohl sie logisch natürlich aus einem Guss sind.</p>
<p>Hatte gehofft, ich könnte wie bei einem Texteditor was einfügen, speichern sagen und fertig. Gibt's da noch keine Klassen für, die sowas können?</p>
<p>Ansonsten hab ich mir noch überlegt, zwischen den Objekten zu unterscheiden, ob sie nun CByteArrays mit gleich oder unterschiedlicher Größe übergeben. Die statischen können alle in dieselbe Datei und dort kann dann jeweils der alte Eintrag überschrieben werden, für die dynamischen Array könnte man pro Objekt eine Datei anlegen bzw. es in etwa so machen, wie du vorhin beschrieben hast. Bzw. könnte dann auch gleich jedes Objekt eine eigene Datei bekommen. Denn selbst wenn ich mehrere 1000 Objekte (und demzufolge auch Dateien haben sollte), dann würde es ja wahrscheinlich keinen Unterschied machen, ob ich nun viele kleine Dateien immer wieder öffne, schreibe, schließe oder eine große Datei öffne, parse, schreibe, schließe. Da ist das erste vielleicht sogar noch performanter oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233112</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Thu, 22 Feb 2007 10:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 10:46:23 GMT]]></title><description><![CDATA[<p>Wenn du in einem Text-Editor etwas eingibst, wird das auch zunächst nur im Arbeitsspeicher zwischengelagert (dort hast du tatsächlich mehr und differenziertere Möglichkeiten, deine Daten zu fragmentieren) und erst beim Speichern (bzw. wenn er in regelmäßigen Abständen automatisch speichert) der komplette Dateiinhalt auf Disk geschrieben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233132</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Feb 2007 10:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to Ideale Speichermethode gesucht on Thu, 22 Feb 2007 11:02:29 GMT]]></title><description><![CDATA[<p>Hm stimmt ja, da wird ja auch immer das komplette File neu geschrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Hatte irgendwie gedacht, dass das Dateisystem auch irgendwie mit verketteten Listen arbeitet und daher ohne Probleme irgendwo mal ein Stück einfügen/rausreißen kann ohne alles andere neuschreiben zu müssen...</p>
<p>Na gut, dann hab ich das wohl irgendwie verrissen und mich wohl zu sehr auf diese Möglichkeit versteift.</p>
<p>Dann ist wahrscheinlich wirklich die Methode mit einer Datei je CByteArray am besten oder gibt's noch andere Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1233145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1233145</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Thu, 22 Feb 2007 11:02:29 GMT</pubDate></item></channel></rss>