<?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[gepufferter Dateizugriff]]></title><description><![CDATA[<p>Ich bin mir sicher, dass es eine fertige Lösung zu folgendem Problem gibt, aber ich finde sie gerade nicht:</p>
<p>Ich möchte Daten aus großen Files lesen und schreiben.<br />
Am liebsten würde ich die gesamte Datei in einen C-Array oder einen Vector<br />
laden und mit dem Arrayindex auf die Bytes einzeln zugreifen.<br />
Bei Files, die größer als der Arbeitsspeicher sind (Größenordnung GB)<br />
ist das keine gute Idee. Der Zugriff erfolgt mehr oder weniger lokal im File,<br />
läuft aber nach und nach über das ganze File, mal vor mal wieder ein Stück<br />
zurück. Natürlich kann kann ich mir selbst einen Buffer anlegen und den Teil,<br />
den ich gerade bearbeiten will dort reinladen, wenn ich über die Grenzen hinaus<br />
komme die Daten wieder zurück ins File schreiben und den nächsten Block<br />
nachladen. Aber so etwas müsste es doch auch schon fertig geben.</p>
<p>Ich suche also eine Klasse, die sozusagen Vector und fstream vereinigt:<br />
Ich initialisiere die Klasse mit einem Filenamen oder Filepointer, weise<br />
einen Buffer oder eine Buffergröße zu und der Buffer wird angelegt und dann<br />
kann ich mit der Klasse arbeiten wie mit einem Vector. Elemente, die gerade<br />
nicht im Speicher sind, werden nachgeladen und zuvor ggf. geänderte Daten<br />
ins File geschrieben. Zugriffe auf das File sollen blockweise geschehen,<br />
und zwar immer nur dann, wenn die jeweils angesprochene Fileposition gerade<br />
nicht im Speicher ist. Ich möchte eben aus Performance-Gründen nicht bei<br />
jedem Zugriff ein fseek aufrufen und dabei Zugriff auf jede beliebige<br />
Position im File haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200746/gepufferter-dateizugriff</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 02:06:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200746.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Dec 2007 11:33:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to gepufferter Dateizugriff on Wed, 19 Dec 2007 11:33:49 GMT]]></title><description><![CDATA[<p>Ich bin mir sicher, dass es eine fertige Lösung zu folgendem Problem gibt, aber ich finde sie gerade nicht:</p>
<p>Ich möchte Daten aus großen Files lesen und schreiben.<br />
Am liebsten würde ich die gesamte Datei in einen C-Array oder einen Vector<br />
laden und mit dem Arrayindex auf die Bytes einzeln zugreifen.<br />
Bei Files, die größer als der Arbeitsspeicher sind (Größenordnung GB)<br />
ist das keine gute Idee. Der Zugriff erfolgt mehr oder weniger lokal im File,<br />
läuft aber nach und nach über das ganze File, mal vor mal wieder ein Stück<br />
zurück. Natürlich kann kann ich mir selbst einen Buffer anlegen und den Teil,<br />
den ich gerade bearbeiten will dort reinladen, wenn ich über die Grenzen hinaus<br />
komme die Daten wieder zurück ins File schreiben und den nächsten Block<br />
nachladen. Aber so etwas müsste es doch auch schon fertig geben.</p>
<p>Ich suche also eine Klasse, die sozusagen Vector und fstream vereinigt:<br />
Ich initialisiere die Klasse mit einem Filenamen oder Filepointer, weise<br />
einen Buffer oder eine Buffergröße zu und der Buffer wird angelegt und dann<br />
kann ich mit der Klasse arbeiten wie mit einem Vector. Elemente, die gerade<br />
nicht im Speicher sind, werden nachgeladen und zuvor ggf. geänderte Daten<br />
ins File geschrieben. Zugriffe auf das File sollen blockweise geschehen,<br />
und zwar immer nur dann, wenn die jeweils angesprochene Fileposition gerade<br />
nicht im Speicher ist. Ich möchte eben aus Performance-Gründen nicht bei<br />
jedem Zugriff ein fseek aufrufen und dabei Zugriff auf jede beliebige<br />
Position im File haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423077</guid><dc:creator><![CDATA[mrbaseman]]></dc:creator><pubDate>Wed, 19 Dec 2007 11:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to gepufferter Dateizugriff on Wed, 19 Dec 2007 11:53:52 GMT]]></title><description><![CDATA[<p>Dann solltest du mal bei deinem Betriebssystem nach Funktionen für 'File Mapping' Ausschau halten.<br />
<a href="http://en.wikipedia.org/wiki/Memory-mapped_file" rel="nofollow">http://en.wikipedia.org/wiki/Memory-mapped_file</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423093</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Wed, 19 Dec 2007 11:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to gepufferter Dateizugriff on Wed, 19 Dec 2007 13:52:22 GMT]]></title><description><![CDATA[<p>danke, das hilft bei der Performance-Frage weiter. Aber wenn ich das recht<br />
verstehe, muss man als Programmierer immer noch den richtigen Bereich aus<br />
dem File mappen und die File-Position relativ zum ersten gemappten Byte angeben,<br />
beim Überschreiten der Arraygrenzen den Bereich wieder mit unmmap freigeben,<br />
einen anderen Bereich dafür wieder mappen (wenn man nicht das gesamte File<br />
in den Speicher laden kann).</p>
<p>Mit fstream::rdbuf scheint mir das gleiche Problem vorzuliegen. Auch da sind<br />
die Adressen auf den Buffer bezogen und nicht auf die Position im File.</p>
<p>Ich hätte gerne eine Klasse, für die der []-Operator überladen ist, so dass man<br />
dort die Position innerhalb des Files angeben kann und der Operator greift intern<br />
auf den Buffer zu, falls diese Position im Buffer ist, andernfalls wird der<br />
Bufferinhalt bei Bedarf ins File geschrieben und ein anderer Bereich geladen, der<br />
die Adresse enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423237</guid><dc:creator><![CDATA[mrbaseman]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:52:22 GMT</pubDate></item></channel></rss>