<?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[Große Dateien sequentiell einlesen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage bezüglich dem Einlesen von großen Dateien (ab 2 GB). Da ich die Datei nicht komplett in den Speicher laden will/kann, würde ich sie gerne stückchenweise sequentiell laden. Welche Klasse/Bibliothek bietet sich am besten an, um so etwas möglichst effizient zu realisieren. Die Datei soll außerdem im Binary Modus eingelesen werden.<br />
Wenn Links zu Dokumentationen vorhanden sind, oder Beispiele vorliegen würde ich mich sehr freuen.</p>
<p>Vielen Dank im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174486/große-dateien-sequentiell-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 02:30:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174486.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Feb 2007 19:43:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Tue, 27 Feb 2007 19:43:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage bezüglich dem Einlesen von großen Dateien (ab 2 GB). Da ich die Datei nicht komplett in den Speicher laden will/kann, würde ich sie gerne stückchenweise sequentiell laden. Welche Klasse/Bibliothek bietet sich am besten an, um so etwas möglichst effizient zu realisieren. Die Datei soll außerdem im Binary Modus eingelesen werden.<br />
Wenn Links zu Dokumentationen vorhanden sind, oder Beispiele vorliegen würde ich mich sehr freuen.</p>
<p>Vielen Dank im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236410</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Tue, 27 Feb 2007 19:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Tue, 27 Feb 2007 20:52:06 GMT]]></title><description><![CDATA[<p>CFile!?<br />
ReadFile!?<br />
fread!?</p>
<p>Ganz grob gesagt: Du kannst verwendest was Du willst... am schnellsten geht es wohl mit MapViewOfFile und direkt WinAPI, wobei sich da auch die Geister scheiden... schnell wird es nämlich erst, wenn man die Datei das 2. Mal einliest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236439</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 27 Feb 2007 20:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Wed, 28 Feb 2007 00:20:40 GMT]]></title><description><![CDATA[<p>Öh.<br />
ReadFile funktioniert ganz gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ob ein File Mapping Sinn macht kommt darauf an, weiss ja nicht was du genau mit den eingelesenen Daten machen willst.</p>
<p>Wenn man die Datei bloss von ganz vorne bis ganz hinten durchlesen möchte (um z.B. einen Hashcode drüber zu rechnen) wird es denke ich nichts schnelleres als einfach ReadFile mit einem grossen Puffer (100MB oder so) geben. Ggf. beim Öffnen (CreateFile) FILE_FLAG_SEQUENTIAL_SCAN mitgeben.<br />
Will man die Daten da drin irgendwohin kopieren genauso, oder wenn man 2 riesen Files Byte für Byte vergleichen will.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5675">@Jochen</a> Kalmbach: bei einer Datei die nicht ganz in den Speicher passt wird das 2. mal einlesen mit einem File Mapping auch nicht viel schneller werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15113">@Brotherhood</a>: es wäre sicherlich nicht verkehrt zu wissen was du mit den Daten dann machen willst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236506</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 28 Feb 2007 00:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Wed, 28 Feb 2007 08:05:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ersteinmal Danke für die Antworten.</p>
<p>Es geht darum, dass ich einen sequentiellen Scan über die eingelesenen Daten laufen lassen muss. Dabei handelt es sich aber um Bitdaten, die nur zu Speicherzwecken in größere Dateitypen zusammengesetzt wurden.</p>
<p>Um es also am Beispiel zu erklären. Ich habe eine Bitsequenz mit 64 Bit die für vier Einträge à 16 Bit steht. Diese 64 Bit kann ich jetzt zum Beispiel in zwei Integer umwandeln und diese dann speichern, dabei ist wichtig, dass wenn möglich jedes Bit genutzt wird.</p>
<p>Beim Auslesen ist es jetzt eigentlich egal ob die Daten zusammenhängend kommen oder nicht. Es ist halt nur wichtig, dass es effizient mit möglichst wenig Festplattenzugriffen arbeitet.</p>
<p>Um die Frage mit den Zugriffen zu beantworten: Die Daten werden nur einmal eingelesen. Die restliche Arbeit findet im Hauptspeicher statt.</p>
<p>Ich hoffe ich konnte ein wenig erklären worum es geht. Ich habe leider selber bis jetzt mehr mit OO-Programmierung in C++ verbracht und nicht so nahe am System gearbeitet. Beim jetzigen Projekt geht es aber um die Effizienz und wie gesagt habe ich damit noch nicht so viel Erfahrung :).</p>
<p>Vielen Dank nochmals für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236586</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Wed, 28 Feb 2007 08:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Thu, 01 Mar 2007 11:46:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab das ganze jetzt einfach mal mit ReadFile implementiert. Was mir momentan aber nicht gelingt, ist die Buffergröße auf mehrere MB einzustellen.</p>
<p>Ich hab auch im Internet gesucht, finde aber die Informationen zu ReadFile etc. sehr dürftig. Momentan dauert der sequentielle Scan sehr lange, was aber durch einen optimierten Buffer beschleunigt werden müsste. Nur weiss ich nicht wie ich das bewerkstelligen kann.</p>
<p>Interessant wäre auch zu wissen, wieviel Bytes mit einem Festplattenzugriff gelesen werden können, gibt es eine Möglichkeit diese Information für ein System auszulesen? Also sozusagen, dass ich mit jedem ReadFile genau soviele Daten einlese, wie es mit einem Festplattenzugriff möglich ist (also im Prinzip die Seitengröße). Über Antworten würde ich mich freuen.</p>
<p>Viele Dank im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237364</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Thu, 01 Mar 2007 11:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Thu, 01 Mar 2007 12:05:39 GMT]]></title><description><![CDATA[<p>Ich bezweifle sehr ob Du durch vergrößern des ReadFile Puffers mehr Speed bekommst. IMHO optimiert das OS sowieso zwischen den Operationen wenn Du die Datei mit FILE_FLAG_SEQUENTIAL_SCAN.</p>
<p>Große Puffer führen meistens nur wieder zu knappen Speicher und swapping.</p>
<p>Was ist Dein Problem Spoeicher über mehrere MBs zu allokieren!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237376</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 01 Mar 2007 12:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Thu, 01 Mar 2007 12:46:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das Problem ist, dass ich nicht weiß wie ich es machen kann :). Also ich habe beispielsweise folgenden Zugriff:</p>
<pre><code>hSrc = CreateFile(_T(&quot;C:\\test.dat&quot;), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN , 0);

[...]

char pBuffer[256];
do
{
    ReadFile(hSrc, pBuffer, sizeof(pBuffer), &amp;dwRead, NULL);

    [...]

} while (dwRead != 0);
</code></pre>
<p>Je nachdem wie groß ich pBuffer wähle ist schon ein Unterschied in der Zugriffszeit zu messen. Am liebsten würde ich ihn ja so einstellen, dass er immer genau eine Seite liest. Nur weiß ich nicht, wie ich die Seitengröße ermitteln kann, noch ob dies wirklich die richtige Stelle ist um den Buffer einzustellen.</p>
<p>Viele Dank für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237399</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Thu, 01 Mar 2007 12:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Thu, 01 Mar 2007 13:12:33 GMT]]></title><description><![CDATA[<p>Brotherhood schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>das Problem ist, dass ich nicht weiß wie ich es machen kann :). Also ich habe beispielsweise folgenden Zugriff:</p>
<pre><code>hSrc = CreateFile(_T(&quot;C:\\test.dat&quot;), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN , 0);

[...]

char pBuffer[256];
do
{
    ReadFile(hSrc, pBuffer, sizeof(pBuffer), &amp;dwRead, NULL);

    [...]

} while (dwRead != 0);
</code></pre>
<p>Je nachdem wie groß ich pBuffer wähle ist schon ein Unterschied in der Zugriffszeit zu messen. Am liebsten würde ich ihn ja so einstellen, dass er immer genau eine Seite liest. Nur weiß ich nicht, wie ich die Seitengröße ermitteln kann, noch ob dies wirklich die richtige Stelle ist um den Buffer einzustellen.</p>
<p>Viele Dank für die Hilfe!</p>
</blockquote>
<p>Auf dem Stack kannst du nicht viel anlegen (Standard: 1MB), du solltest also den Puffer dynamisch anlegen.<br />
Die Sektorgrösse der Festplatte (512 Byte) ist übrigens ziemlich egal, die Seitengrösse von Windows (normalerweise 4KB), bzw. die Clustergrösse von NTFS (normale auf 4KB) sind auch nicht wirklich wichtig. Ich habe vor ein paar Jahren (mit noch wesentlich langsameren Platten, und unter Windows 2000) mal ein paar Tests gemacht, damals war die max. Geschwindigkeit bei etwa 512KB Puffergrösse erreicht.</p>
<p>Ahja, wenn dein Puffer ausreichend gross ist, und eine 2er Potenz, dann wirst du immer genau auf einer Block-Grenze landen, immer genau auf einer Page-Grenze und immer genau auf einer Cluster-Grenze. Also verdoppele deine Puffergrösse einfach immer, solange bis es nimmer schneller wird, oder aber bis du dir den Speicher nimmer leisten kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237436</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Mar 2007 13:12:33 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Thu, 01 Mar 2007 13:47:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Auf dem Stack kannst du nicht viel anlegen (Standard: 1MB), du solltest also den Puffer dynamisch anlegen.</p>
</blockquote>
<p>Das klingt sehr gut, nur wie mach ich das :). Wäre super, wenn du mir ein kleines Beispiel geben könntest. Zeiger auf Speicher setzen und dann allozieren?</p>
<p>Viele Grüße und danke für die schnelle Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237470</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Thu, 01 Mar 2007 13:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Fri, 02 Mar 2007 12:52:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;
void foo()
{
    std::vector&lt;char&gt; buffer(1024*1024*8); // 8 MB buffer
    char* bufptr = &amp;(buffer[0]);

    // bufptr verwenden
    // ...
}
</code></pre>
<p>Wichtig ist dabei nur dass du den std::vector in Ruhe lässt solange du dir einen Zeiger auf dessen Inhalt gemerkt hast -- sonst könnte es sein dass der Zeiger ungültig wird (z.B. wenn du push_back/insert/... aufrufst könnte es sein dass der vector einen neuen Speicherplatz anfordern muss).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238052</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 02 Mar 2007 12:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Mon, 05 Mar 2007 10:13:50 GMT]]></title><description><![CDATA[<p>Vielen Dank für den Code. Ich war das Wochenende aufgrund einer Grippe ans Bett gefesselt und werde mich jetzt voller Elan daran machen, obigen Code einmal auszuprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239392</guid><dc:creator><![CDATA[Brotherhood]]></dc:creator><pubDate>Mon, 05 Mar 2007 10:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Mon, 05 Mar 2007 11:20:55 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::vector&lt;char&gt; buffer(1024*1024*8); // 8 MB buffer
}
</code></pre>
</blockquote>
<p>Warum nicht new oder CHeapPtr&lt;&gt;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239422</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 05 Mar 2007 11:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to Große Dateien sequentiell einlesen on Mon, 05 Mar 2007 19:25:46 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::vector&lt;char&gt; buffer(1024*1024*8); // 8 MB buffer
}
</code></pre>
</blockquote>
<p>Warum nicht new oder CHeapPtr&lt;&gt;?</p>
</blockquote>
<p>Weil ich die Klasse garnicht kannte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Und wenn ich sie gekannt hätte ... weil ich ne Abneigung gegen MFC &amp; ATL hab' <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
(wobei noch lieber ATL als MFC...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239806</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Mar 2007 19:25:46 GMT</pubDate></item></channel></rss>