<?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[Datei-Sortierung]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>ich suche nach der - wirklich - schnellsten Möglichkeit eine Datei zu sortieren.<br />
Welche möglichkeiten habe ich da mit STANDARD MITTELN. Wie man eine Datei selbst sortiert, weiß ich auch <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/topic/256005/datei-sortierung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 16:51:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256005.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Dec 2009 07:31:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 07:31:53 GMT]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>ich suche nach der - wirklich - schnellsten Möglichkeit eine Datei zu sortieren.<br />
Welche möglichkeiten habe ich da mit STANDARD MITTELN. Wie man eine Datei selbst sortiert, weiß ich auch <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/1818885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818885</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 07 Dec 2009 07:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 07:57:20 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Guten Morgen,<br />
ich suche nach der - wirklich - schnellsten Möglichkeit eine Datei zu sortieren.<br />
Welche möglichkeiten habe ich da mit STANDARD MITTELN. Wie man eine Datei selbst sortiert, weiß ich auch <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>
</blockquote>
<p>Ohne alles: introsort oder mergesort<br />
Nach was sortieren? Zeilenweise lexikographisch? Oder Byteweise? Oder Records fester Länge? Paßt die Datei locker ins RAM? Ist eine Vorsortierung zu erwarten? Wieviele Kerne hast Du zur Verfügung? Welches BS?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818892</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 07 Dec 2009 07:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 08:16:18 GMT]]></title><description><![CDATA[<p>Favorisiere quick sort. Vergleich erfolgt byteweise. Records unterschiedlicher Länge werden erwartet.</p>
<p>Kernanzahl ist nicht fixierbar; bis zu 4 sind aber möglich, sollte daher auch multi-threaded (mit anschließendem merge) laufen.<br />
BS: Windows XP - Windows 7; Windows Server 2003 - 2008</p>
<p>Propriertäre Lösung wollte ich mal gegen eine Variante mit Standard Klassen halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818897</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 07 Dec 2009 08:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 09:15:47 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Propriertäre Lösung wollte ich mal gegen eine Variante mit Standard Klassen halten.</p>
</blockquote>
<p>Immer noch nicht genug Daten. Da Du nicht alle Tricks kennst, aber alle passenden Tricks empfohlen haben möchstest, kannst Du nicht auswählen, welche Daten für uns wichtig sind. Also leg das Format und die zu erwartenden Datenverteilung der Meßdatei offen.<br />
So kann ich noch nichtmal zwischen hauptsächlich quicksort(also introsort, du Nase) und hauptsächlich mergesort abschätzen.<br />
Also mal ein paar Allgemeinplätze: Nach Möglichkeit malloc/free bzw. new/delete sparen oder beschleunigen. Das macht splitten und mergen auch bei kleineren Größen so interessant, insbesondere den 256-Splitter. Eigener small object allocator ist nett. Bei Multithreading jedem Thread einen eigenen Speicherbereich geben. Freigabe dem memory pool überlassen. Vielleicht non-copy-strings verwenden, also Ranges auf fremden Speicher, zur Not auf die vorher komplett eingelesene Datei oder einen teil davon. Wir wollen ka kein filemapping nehmen *heul*. Wenns zu viel für's RAM ist, mergesort. Kleine Happen quicksort, aufpassen, RAM ist lahm, vielleicht nur Happen bis zur Größe des Prozessorcaches per quicksort. Kleine Reste per insertion sort, also quicksort einfach nicht bis unten absteigen lassen. Immer ein radix sort im Ärmel haben und Gegentesten. Warum nicht erstmal in einem Rutsch in 256 Dateien spalten (und gleichzeitig für jede Datei ein Histogramm der Verteilung der zweiten Bytes erstellen (256 integers wiegen ja nichts) und bei guter Datenlage und wenn groß genug, rekursiv runtergehen). Drei-Wege-Quicksort. Wie weit bringen einen die klassischen Künste wie natürliches mergesort und mehrere merge-Dateien (also ein Mini-Heap im RAM)? Sollte eigentlich BS-Aufrufe und String-Ende-Suchen sparen.<br />
Alles hängt von der Verteilung ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818907</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 07 Dec 2009 09:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 09:33:21 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>[...]<br />
Alles hängt von der Verteilung ab.</p>
</blockquote>
<p>Würde es dir etwas ausmachen, dass in diesem Kontext näher auszuführen? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1818919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818919</guid><dc:creator><![CDATA[TheTester]]></dc:creator><pubDate>Mon, 07 Dec 2009 09:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 10:56:05 GMT]]></title><description><![CDATA[<p>Ich hab Dateien die 50 - maximal 150 MB groß sind. Die Sortierung läuft auf PCs mit lediglich 512 MB RAM, aber auch auf Servern mit deutlich mehr (spielt bei der Dateigröße nicht die große Rolle).</p>
<p>Grundsätzlich binäre Dateien, enthalten zum Teil aber auch Strings. Es handelt sich um Index-Dateien einer Datenbank. D.h. sie enthalten den Index und die Position in der Datenbank (4 Byte + n).</p>
<p>Mein bisheriges Verfahren (was ich nicht offen legen kann) benötigt für eine 70 MB Datei mit einer 20 Byte Struktur (nur Integer-Werte) 8 Sekunden mit nur einem Thread.</p>
<p>Ich muss aber bei der gleichen Struktur auf ca. 2 Sekunden runterkommen. Ich verwende einen normalen quick sort um das schon mal zu sagen. Ich würde die Datei jetzt in Abschnitte (im Speicher) unterteilen und mit 4 Threads sortieren lassen. Im Anschluss wäre dann noch ein Merge fällig.</p>
<p>Ich erwarte hier keine vollständige Lösung. Mir reicht die Nennung einer schnellen Möglichkeit oder eines schnellen Verfahrens.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818951</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 07 Dec 2009 10:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 12:28:53 GMT]]></title><description><![CDATA[<p>Was mich interessieren würde:</p>
<p>Wofür sollte ich einen eigenen Allocator brauchen?<br />
Bisher bin ich so verfahren, dass ich eine 2D Matrix erstellt habe, welche die Datei für mich hält.</p>
<p>Also so ungefähr:</p>
<pre><code class="language-cpp">unsigned char** buf = new unsigned char*[n1]();
for( int i = 0; i &lt; n1; i++ )
     *(buf + i) = new unsigned char[n2]();
</code></pre>
<p>Das gebe ich am Ende wieder frei ... mehr nicht.</p>
<p>Ich versuch mal wieder zu geben, was du meinst:<br />
Eigenen Memory Pool zu beginn schaffen. Eine Allocator funktion benutzen, um Speicher aus diesem Pool zu allokieren.<br />
Das ganze dient der beschleunigten SPeicher Allokierung und verminderter Heap-Fragmentierung.</p>
<p>Das bringt aber doch auch nur was, wenn ich ständig Speicher allokieren, &quot;freigeben&quot; würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818985</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 07 Dec 2009 12:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 13:56:57 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Eigenen Memory Pool zu beginn schaffen. Eine Allocator funktion benutzen, um Speicher aus diesem Pool zu allokieren.<br />
Das ganze dient der beschleunigten SPeicher Allokierung und verminderter Heap-Fragmentierung.</p>
</blockquote>
<p>Und ist unendlich einfach</p>
<pre><code class="language-cpp">void* DatenDing::operator new(size_t size){
   void* old=thePointer;
   thePointer+=size;
   return old;
}
void DatenDing::delete(){
   assert(false);
}
</code></pre>
<p>und auch bei einer Verwendung endlos schnell.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Das bringt aber doch auch nur was, wenn ich ständig Speicher allokieren, &quot;freigeben&quot; würde.</p>
</blockquote>
<p>Ich hatte Befürchtungen, das könnte immer wieder vorkommen, wenn ein Teil der Datei gelesen wird.<br />
Aber die gesamten Daten passen ja ins RAM. Da dürfte das normale new kaum meßbar teurer sein. Macht nichts, ich wollte das bestellte Optimum suchen.</p>
<pre><code>[cpp]
unsigned char** buf = new unsigned char*[n1]();
for( int i = 0; i &lt; n1; i++ )
     *(buf + i) = new unsigned char[n2]();
[/cpp]
</code></pre>
<p>Ist n2 etwa fest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819038</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 07 Dec 2009 13:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 14:25:32 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Grundsätzlich binäre Dateien, enthalten zum Teil aber auch Strings. Es handelt sich um Index-Dateien einer Datenbank. D.h. sie enthalten den Index und die Position in der Datenbank (4 Byte + n).</p>
</blockquote>
<p>also</p>
<pre><code class="language-cpp">struct{
   char schluessel[n];
   char daten[4];
}
</code></pre>
<p>und die schluessel sind eindeutig, also keiner kommt in einer Datei zweimal vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819054</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 07 Dec 2009 14:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Mon, 07 Dec 2009 14:28:53 GMT]]></title><description><![CDATA[<p>n1 ist die Anzahl der Puffer und n2 die Page größe. Also demnach fest.<br />
Ich habe schon überlegt, die Datei komplett in den Speicher zu laden und dann lediglich eine linked list umzusortieren, die auf die Speicherbereiche zeigt. Dann schreib ich die Datei einfach anhand der Angaben in der liste heraus.</p>
<p>Geht doch schneller als die kompletten Structs umkopieren zu müssen.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Und ist unendlich einfach</p>
<pre><code class="language-cpp">void* DatenDing::operator new(size_t size){
   void* old=thePointer;
   thePointer+=size;
   return old;
}
void DatenDing::delete(){
   assert(false);
}
</code></pre>
<p>und auch bei einer Verwendung endlos schnell.</p>
</blockquote>
<p>Kannst du das mal näher erläutern? Ich muss doch am Anfang zwingend mit &quot;new&quot; den memory pool allokieren ... wie kann das schneller sein?</p>
<p>Zudem verstehe ich deinen Code nicht. Sry, wenn ich mich doof anstelle.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>und die schluessel sind eindeutig, also keiner kommt in einer Datei zweimal vor?</p>
</blockquote>
<p>Die Schlüssel können eindeutig sein (Primary Key) müssen aber nicht (Sekundär)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819055</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 07 Dec 2009 14:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 06:44:22 GMT]]></title><description><![CDATA[<p>Ich verfahre jetzt wie folgt:</p>
<p>1. Speicher für gesamte Datei allokieren und in den Arbeitsspeicher laden.<br />
2. array mit Adressen auf die einzelnen Records erstellen und sortieren (verglichen werden dann natürlich weiterhin die referenzierten Werte, aber ich muss lediglich 4 Byte umkopieren)<br />
3. Nach der Sortierung der Adressliste werden nacheinander die Werte in einen AUsgabepuffer kopiert und letztendlich in die Datei geschrieben.</p>
<p>Es würde mich noch freuen, wenn du die Sache mit dem Memory Pool näher erklären könntest; denn ich verstehe den Vorteil weiterhin nicht.</p>
<p>Besten Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819379</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 06:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 09:48:52 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Es würde mich noch freuen, wenn du die Sache mit dem Memory Pool näher erklären könntest; denn ich verstehe den Vorteil weiterhin nicht.</p>
</blockquote>
<p>Der wäre nett gewesen, wenn Du innerhalb einer Schleife new gebraucht hättest. Damit legt man mit vielen pseudo-news Speicher an, undem man ihn vom einmal vorher gesaugten großen Speicher abzwackt. Und man gibt ihn nicht durch kerrespendierende viele deletes frei, sondern am ende durch ein großes delete.<br />
Ist aber hier Unfug, weil Du durch festes n2 spätestens anhand der Dateigröße ja die Anzahl der Arrayelemente vorher recht genau kennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819424</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 09:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 09:58:28 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>1. Speicher für gesamte Datei allokieren und in den Arbeitsspeicher laden.<br />
2. array mit Adressen auf die einzelnen Records erstellen und sortieren (verglichen werden dann natürlich weiterhin die referenzierten Werte, aber ich muss lediglich 4 Byte umkopieren)<br />
3. Nach der Sortierung der Adressliste werden nacheinander die Werte in einen AUsgabepuffer kopiert und letztendlich in die Datei geschrieben.</p>
</blockquote>
<p>Klingt sehr schnell.<br />
Aber warum werden nur die Referenzierten Werte verglichen?<br />
Ich dachte, die Schlüssel seien int. Dann isses vermutlich besser, du baust ´</p>
<pre><code class="language-cpp">struct Sortierding{
   int key;
   int dateiindex;
   friend bool operator&lt;(Sortierding const&amp; a,Sortierding const&amp; b){
      return a.key&lt;b.key;
   }
};
</code></pre>
<p>und sortierst die. Da muß zwar mehr kopiert werden, aber es dürfte viel häufiger Cache-Treffer geben, also Du triffst mächtig oft Daten, die bereits im Prozessorcache liegen, und muß nicht so oft aufs zehnmal langsamer RAM zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819429</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 09:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:11:08 GMT]]></title><description><![CDATA[<p>Ich habe das Sortierkriterium noch nicht ganz mitbekommen.</p>
<blockquote>
<p>Geht doch schneller als die kompletten Structs umkopieren zu müssen.</p>
</blockquote>
<p>Hast du das schon umgesetzt und es dauert trotzdem 8 sec oder ist es nur ein Gedanke von dir? Klar ist es schneller, Zeiger zu sortieren. Wobei man abwaegen muss, wie teuer eine Zeigerdereferenzierung im Vergleich zu einem Kopiervorgang ist. Falls es immer noch nicht reicht, gibt es spezielle Sortierverfahren wie radixsort. Aber da must du schauen, ob die Voraussetzungen in deinem Fall erfuellt sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819435</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:11:38 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>3. Nach der Sortierung der Adressliste werden nacheinander die Werte in einen AUsgabepuffer kopiert und letztendlich in die Datei geschrieben.</p>
</blockquote>
<p>Kann nach Deinen Angaben knapp werden, wenn Du für zweimal Daten zweimal 150M brauchst und nur 512M hast und auf dem Server noch so ein dämlicher Virenscanner läuft. Wollte nur sagen, daß der Schritt 3 auch inplace in O(n) geht. Das wäre nicht so schnell wie mit Zusatzspeicher, aber vieel schneller als ins Thrashing zu geraten oder n durcheinanderene Dateilesezugriffe zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819436</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:34:03 GMT]]></title><description><![CDATA[<p>Bin am hin und her überlegen:</p>
<p>Ich fahre ja einen QuickSort. Diesen zu beschleunigen gelingt eigentlich nur durch eine Vorsortierung. Diese habe ich mir folgendermaßen vorgestellt:</p>
<pre><code class="language-cpp">void* presort(
	char*  source,
	char*  dest,
	size_t elSize,
	size_t beg,
	size_t end,
	size_t mask = 0xFF
)
{
	std::vector&lt;char*&gt;* idx = new std::vector&lt;char*&gt;[mask+1]();
	source += (end * elSize) - 1;
	end -= beg;

	do
	{

		(idx + (*source &amp; mask))-&gt;push_back(source);
		source -= elSize;
	}
	while( --end );

	for( unsigned i = 0; i &lt;= mask; i++ )
	{
		if(	!(idx + (*source &amp; mask))-&gt;empty() )
		{
			for( unsigned j = 0; j &lt; (idx + (*source &amp; mask))-&gt;size(); j++ )
			{
				memcpy(
					reinterpret_cast&lt;char*&gt;(dest) += (i * elSize),
					(idx + (*source &amp; mask))-&gt;at(j),
					elSize
				);
			}				
		}
	}

	return dest;
	delete[] idx;
}
</code></pre>
<p>Es wird also nach dem most significant byte ein index erzeugt, der die Speicheradressen der Sortiermenge hält.<br />
Danach werden die referenzierten Speicherstellen in dest kopiert.</p>
<p>Diesen Vorgang würde ich an folgender Stelle einsetzen:</p>
<pre><code class="language-cpp">unsigned char *tmp = new unsigned char[n2](), *paddr;
unsigned char** buf = new unsigned char*[n1]();
for( int i = 0; i &lt; n1; i++ ) {
     *(buf + i) = new unsigned char[n2]();
}

DWORD dwBytesRead = 0;
for( UINT i = 0; i &lt; n2; i++ )
{
	ReadFile(
		hFile,
		*(buf + i),
		n1,
		&amp;dwBytesRead,
		NULL
	);

	tmp = presort(
		*(buf + i),
		tmp,
		-1,
		-1
	);

	paddr = tmp;
	tmp = *(buf + i); 
	*(buf + i) = paddr;
}
</code></pre>
<p>So ungefähr jedenfalls. Nachteilig ist wohl die Verwendung vom STL-Container vector oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819447</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:40:46 GMT]]></title><description><![CDATA[<blockquote>
<p>QuickSort</p>
</blockquote>
<p>Schon mal die Sortierroutine der STL benutzt? QuickSort hat quadratische Laufzeit im worst case.</p>
<blockquote>
<p>Nachteilig ist wohl die Verwendung vom STL-Container vector oder?</p>
</blockquote>
<p>Nein, warum?</p>
<pre><code class="language-cpp">reinterpret_cast&lt;char*&gt;(dest)
</code></pre>
<p>Verstehe ich nicht, dest ist doch schon vom Typ char*.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819451</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:40:46 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:45:23 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Verstehe ich nicht, dest ist doch schon vom Typ char*.</p>
</blockquote>
<p>Ist ja auch quatsch. Hab ich mal eben so dahin geschrieben.<br />
Die STL-Routinen sind etwas langsamer ... ich will aber 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>Verwendung von STL-Containern nachteilig? Ich denke mal, dass das im Vergleich ziemlich langsam sein könnte.<br />
Ohne nach zu schauen behaupte ich mal, dass vector immer wieder neuen speicher vom heap allokiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819456</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:54:05 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct Sortierding{
   int key;
   int dateiindex;
   friend bool operator&lt;(Sortierding const&amp; a,Sortierding const&amp; b){
      return a.key&lt;b.key;
   }
};
</code></pre>
</blockquote>
<p>Der Schlüssel ist kein einfacher Integer, sondern kann ein bis zu 100 Byte langer Composite Key sein. Ich unterscheide ansonsten nur zwischen Integer und String (wegen litte- und bigendian). Zum Vergleich benutze ich z.B. folgende Funktion:</p>
<pre><code class="language-asm">push	edi
		push	esi
		push	ebx

		xor		ebx, ebx

		test	ecx, 0xFFFFFFFC
		lea		esi, DWORD PTR [eax+ecx-1]
		lea		edi, DWORD PTR [edx+ecx-1]
		jz		__Bytes

		sub		esi, 3
		sub		edi, 3

__DWORDs:
		mov		eax, DWORD PTR [esi]
		mov		edx, DWORD PTR [edi]

		cmp		eax, edx
		jnz		__Final

		sub		esi, 4
		sub		edi, 4
		sub		ecx, 4

		test	ecx, 0xFFFFFFFC
		jnz		__DWORDs
		test	ecx, ecx
		jz		__Final

		add		esi, 3
		add		edi, 3

__Bytes:
		movzx	eax, BYTE PTR [esi]
		movzx	edx, BYTE PTR [edi]

		dec		esi
		dec		edi

		cmp		eax, edx
		jnz		__Final

		dec		ecx
		jnz		__Bytes

__Final:
		seta	bl
		sbb		ebx, 0
		mov		eax, ebx

		pop		ebx
		pop		esi
		pop		edi
</code></pre>
<p>Das wäre für den Integer Vergleich gedacht. Die Vergleichsfunktion übergebe ich per Template-Argument um dem Compiler die Chance zu geben die Funktion an die Aufrufstelle zu kopieren (inlinen); das fällt bei einem Funktionsobjekt weg.</p>
<p>Damit war ich dann noch mal 1 Sekunde schneller als vorher^^.<br />
Der Vergleich macht ziemlich viel aus (= ich war schon bei 24 Sekunden, was nur am Vergleich hängt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819458</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:54:15 GMT]]></title><description><![CDATA[<p>std::vector kann im Zugriff nicht unterboten werden. Kannst sogar auch noch vorher so viel Speicher anlegen, wie Du brauchst.<br />
Und für zufällige ints kannste std::sort auch vermutlich nicht unterbieten, wenn Du bei einem vergleichenden Sortieren bleibst. Insbesondere reißt keine Quicksort-Implemetierung. Ich habs mit etlichen probiert.<br />
Aber zum Glück darfst Du radix sort und Co ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819460</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:56:10 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Klingt sehr schnell.<br />
Aber warum werden nur die Referenzierten Werte verglichen?<br />
Ich dachte, die Schlüssel seien int. Dann isses vermutlich besser, du baust</p>
</blockquote>
<p>Wenn die Schlüssel int (4 Byte) wären, wäre es nicht gerade sinnvoll einen (4 Byte) Pointer zu nehmen, der dann auch noch dereferenziert werden muss <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="😉"
    /><br />
So leicht ist es leider nicht.</p>
<p>Was willst du sonst noch vergleichen? Evtl. verstehen wir uns gerade falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819461</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 10:58:29 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>std::vector kann im Zugriff nicht unterboten werden. Kannst sogar auch noch vorher so viel Speicher anlegen, wie Du brauchst.<br />
Und für zufällige ints kannste std::sort auch vermutlich nicht unterbieten, wenn Du bei einem vergleichenden Sortieren bleibst. Insbesondere reißt keine Quicksort-Implemetierung. Ich habs mit etlichen probiert.<br />
Aber zum Glück darfst Du radix sort und Co ausprobieren.</p>
</blockquote>
<p>Meinst du jetzt, dass std::sort so unfassbar schnell ist oder, dass allgemein ein QuickSort nicht der schnellste ist?</p>
<p>Radix-Sort wäre doch ein gutes Intro für den QuickSort oder?<br />
Die ganze Datei mit Radix sortieren ... dafür sind manche Keys zu lang würde ich sagen oder?</p>
<p>Das &quot;presort&quot; wie ich's vorgestellt habe, ist ja eine light variante von radix (im weitesten Sinne).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819462</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 10:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 11:03:03 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich unterscheide ansonsten nur zwischen Integer und String (wegen litte- und bigendian).</p>
</blockquote>
<p>Vielleicht besser, Du drehst die Schlüsselbytes beim Laden um, um optimal schnell vergleichen zu können.<br />
Strings riechen stark nach Drei-Wege-Quicksort. Für wenn der Schlüssel doch nur ein int ist, radix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819463</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 11:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 11:06:51 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Meinst du jetzt, dass std::sort so unfassbar schnell ist oder, dass allgemein ein QuickSort nicht der schnellste ist?</p>
</blockquote>
<p>Für zufällige ints meine ich beides, wobei mir klar ist, daß introsort im Kern ein quicksort ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819467</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 08 Dec 2009 11:06:51 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 11:07:56 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich unterscheide ansonsten nur zwischen Integer und String (wegen litte- und bigendian).</p>
</blockquote>
<p>Vielleicht besser, Du drehst die Schlüsselbytes beim Laden um, um optimal schnell vergleichen zu können.<br />
Strings riechen stark nach Drei-Wege-Quicksort. Für wenn der Schlüssel doch nur ein int ist, radix.</p>
</blockquote>
<p>Ich kann auch so optimal schnell vergleichen (siehe ASM-Code). Das nimmt sich da nichts.</p>
<p>Was ist deine Meinung? Auf ein Intro mit Radix, dann QuickSort setzen? Multi-Threaded fahren? Würde gerne mal deine Meinung hören. Gehen wir aber mal davon aus, dass wir nur Integer (aber eben bis zu 32 Byte lange) haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819468</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 11:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Datei-Sortierung on Tue, 08 Dec 2009 11:12:32 GMT]]></title><description><![CDATA[<p>Also zumindest das <a href="http://msdn.microsoft.com/en-us/library/ecdecxh1%28VS.80%29.aspx" rel="nofollow">sort aus der STL</a> hat mehrere Probleme:</p>
<p>1. Ich kenne den Typ nicht (ist im Endeffekt ein byte array für mich)<br />
2. Ich habe puffer + pages und keinen linearen speicher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819472</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 08 Dec 2009 11:12:32 GMT</pubDate></item></channel></rss>