<?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[Dateien einlesen | Das muss doch schneller gehen]]></title><description><![CDATA[<p>Hallo,<br />
ich lese aus 108 Dateien 1.192.555 Datensätzen ein und das dauert sage und schreibe 6,5 Minuten. Wenn ich diese Zeit immer warten muss bevor ich irgendeine kleine Änderung am Programm testen kann, dann bin ich ja alt bevor das Programm fertig ist. Andererseits müssen die Daten auch alle gleichzeitig im Programm sein.</p>
<p>Wie kann man das ganze schneller machen?</p>
<p>Bisher lese ich die Daten so ein:</p>
<pre><code class="language-cpp">BOOL CHSIDepotmanagerDlg::load_stock_data()
	{
	////
	//	Vorbereitung des CProgress-Fensters
		m_progress_dialog.init(0,m_stockCtrl.GetItemCount());
		m_progress_dialog.show();
		m_progress_dialog.setText(&quot;Laden der historischen Kursdaten ...&quot;);

	////
	//	Einlesen der Kursdaten
		CString		stock_symbol, filename, fullpath, strLesePuffer, error, header, substring;
		CStdioFile	DateiLesen;

		int stock_index;
		int rows_read=0;

		for(stock_index=0; stock_index&lt;m_stockCtrl.GetItemCount(); stock_index++)
		{
		stock_symbol	=	m_stockCtrl.GetItemText(stock_index,0);
		filename		=	stock_symbol;	filename.Replace(&quot;.&quot;,&quot;_&quot;);	filename += &quot;.csv&quot;;
		fullpath		=	path_stock_data + &quot;\\&quot; + filename;
		header			=	&quot;Date,Open,High,Low,Close,Volume,Adj. Close*&quot;;

		int	pos, last_pos, length, satz_ident;
		bool abbruch;

		if (DateiLesen.Open(fullpath, CFile::modeRead))
		{
		  while(DateiLesen.ReadString(strLesePuffer))
		  {
			strLesePuffer.TrimLeft();
			strLesePuffer.TrimRight();

			if(strLesePuffer.Find(header,0)==-1)
			{
				pos = 0; last_pos = 0; satz_ident=0;
				abbruch = false;

				while(true)
				{
					pos			= strLesePuffer.Find(&quot;,&quot;,last_pos);

					if(pos==-1){	length = strLesePuffer.GetLength()-last_pos; abbruch = true;
					}else			length = pos-last_pos;

					substring	= strLesePuffer.Mid(last_pos,length);

					if(satz_ident==0){
						stockDB[stock_index].InsertItem(stockDB[stock_index].GetItemCount(),substring);
						rows_read++;
					}else
						stockDB[stock_index].SetItemText(stockDB[stock_index].GetItemCount()-1,satz_ident,substring);

					last_pos	= pos+1;
					satz_ident += 1;

					if(abbruch)	
					break;
				}
			}

			Sleep(1);
		  }
		}else
		{
			error.Format(&quot;Es ist eine Fehler beim Lesen der Datei %s aufgetreten.&quot;,filename);
			MessageBox(error,&quot;Lesefehler&quot;,MB_ICONINFORMATION);
		}

		m_progress_dialog.m_ctlProgress.SetPos(stock_index+1);
		}

	////
	//	Beenden des CProgress-Fensters  
		m_progress_dialog.hide();
	//
	////

		CString a;
		a.Format(&quot;%i&quot;,rows_read);
		MessageBox(a);

	return true;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/170895/dateien-einlesen-das-muss-doch-schneller-gehen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 19:17:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170895.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Jan 2007 17:20:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 17:20:32 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich lese aus 108 Dateien 1.192.555 Datensätzen ein und das dauert sage und schreibe 6,5 Minuten. Wenn ich diese Zeit immer warten muss bevor ich irgendeine kleine Änderung am Programm testen kann, dann bin ich ja alt bevor das Programm fertig ist. Andererseits müssen die Daten auch alle gleichzeitig im Programm sein.</p>
<p>Wie kann man das ganze schneller machen?</p>
<p>Bisher lese ich die Daten so ein:</p>
<pre><code class="language-cpp">BOOL CHSIDepotmanagerDlg::load_stock_data()
	{
	////
	//	Vorbereitung des CProgress-Fensters
		m_progress_dialog.init(0,m_stockCtrl.GetItemCount());
		m_progress_dialog.show();
		m_progress_dialog.setText(&quot;Laden der historischen Kursdaten ...&quot;);

	////
	//	Einlesen der Kursdaten
		CString		stock_symbol, filename, fullpath, strLesePuffer, error, header, substring;
		CStdioFile	DateiLesen;

		int stock_index;
		int rows_read=0;

		for(stock_index=0; stock_index&lt;m_stockCtrl.GetItemCount(); stock_index++)
		{
		stock_symbol	=	m_stockCtrl.GetItemText(stock_index,0);
		filename		=	stock_symbol;	filename.Replace(&quot;.&quot;,&quot;_&quot;);	filename += &quot;.csv&quot;;
		fullpath		=	path_stock_data + &quot;\\&quot; + filename;
		header			=	&quot;Date,Open,High,Low,Close,Volume,Adj. Close*&quot;;

		int	pos, last_pos, length, satz_ident;
		bool abbruch;

		if (DateiLesen.Open(fullpath, CFile::modeRead))
		{
		  while(DateiLesen.ReadString(strLesePuffer))
		  {
			strLesePuffer.TrimLeft();
			strLesePuffer.TrimRight();

			if(strLesePuffer.Find(header,0)==-1)
			{
				pos = 0; last_pos = 0; satz_ident=0;
				abbruch = false;

				while(true)
				{
					pos			= strLesePuffer.Find(&quot;,&quot;,last_pos);

					if(pos==-1){	length = strLesePuffer.GetLength()-last_pos; abbruch = true;
					}else			length = pos-last_pos;

					substring	= strLesePuffer.Mid(last_pos,length);

					if(satz_ident==0){
						stockDB[stock_index].InsertItem(stockDB[stock_index].GetItemCount(),substring);
						rows_read++;
					}else
						stockDB[stock_index].SetItemText(stockDB[stock_index].GetItemCount()-1,satz_ident,substring);

					last_pos	= pos+1;
					satz_ident += 1;

					if(abbruch)	
					break;
				}
			}

			Sleep(1);
		  }
		}else
		{
			error.Format(&quot;Es ist eine Fehler beim Lesen der Datei %s aufgetreten.&quot;,filename);
			MessageBox(error,&quot;Lesefehler&quot;,MB_ICONINFORMATION);
		}

		m_progress_dialog.m_ctlProgress.SetPos(stock_index+1);
		}

	////
	//	Beenden des CProgress-Fensters  
		m_progress_dialog.hide();
	//
	////

		CString a;
		a.Format(&quot;%i&quot;,rows_read);
		MessageBox(a);

	return true;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1213303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213303</guid><dc:creator><![CDATA[mhecker]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:20:32 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 17:52:51 GMT]]></title><description><![CDATA[<p>du könntest 'memory mapped files' benutzen. guckst du: <a href="http://msdn2.microsoft.com/en-gb/library/aa366537.aspx" rel="nofollow">http://msdn2.microsoft.com/en-gb/library/aa366537.aspx</a><br />
damit kannst du die files über pointer ansprechen (als hättest du sie in den speicher geladen).<br />
wenn das nichts hilft, hast du woanders eine bremse drin.<br />
<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/1213321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213321</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 17:58:55 GMT]]></title><description><![CDATA[<p>Und wie lange dauert davon das Einfügen in den ListView?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213328</guid><dc:creator><![CDATA[MKF]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 18:20:04 GMT]]></title><description><![CDATA[<p>MKF schrieb:</p>
<blockquote>
<p>Und wie lange dauert davon das Einfügen in den ListView?</p>
</blockquote>
<p>Ich würde auch eher vermuten, dass es daran liegt.</p>
<p>Lass mal die Einfügeoperationen weg und prüf, wie lange es dann dauert.</p>
<p>Wenn es an den Controls liegt, benutz ein virtuelles Listcontrol (LVS_OWNERDATA).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213336</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sat, 20 Jan 2007 18:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 21:10:49 GMT]]></title><description><![CDATA[<p>Wenn ich die Daten in die CListCtrl schreibe dauert es ca. 8 Minuten, wenn die Daten nicht eingefügt werden dauert es ca. 6 Minuten. Der Zeitunterschied ist also nicht zu vernachlässigen aber das virtuelle Listenelement gefällt mir nicht.</p>
<p>Ich habe gerade darüber nachgedacht statt der CListCtrl's nen struct und nen Array zu nehmen, in das dann die Daten kommen. Würde das schneller gehen?</p>
<p>Ich komme gerade irgendwie nicht weiter.</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213423</guid><dc:creator><![CDATA[mhecker]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sat, 20 Jan 2007 21:50:49 GMT]]></title><description><![CDATA[<ol>
<li>Nimm das &quot;Sleep(1)&quot; raus - was soll das da drin?</li>
<li>Lies grössere Stücke ein, oder verwende eine File API die selbst puffert (z.B. ifstream oder einfach fopen)</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1213450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213450</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sun, 21 Jan 2007 00:16:36 GMT]]></title><description><![CDATA[<p>Das Sleep(1) ist da, damit die CPU Auslastung nicht bei 100% liegt. Die Funktion wird von einem Thread ausgeführt, das hätte ich vielleicht dazu sagen sollen.</p>
<p>Größere Stücke einlesen geht mit der aktuellen Variante nicht, weil die Datei zur Zeit zeilenweise eingelesen wird. Ich werd auch mal eine der von dir genannten Varianten testen.</p>
<p>Einen schönen Fortschritt konnte ich mit Multithreading erzielen. Statt ~8 Min. braucht das Programm jetzt nur noch ~1 Min..</p>
<p>Grüße,<br />
Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213479</guid><dc:creator><![CDATA[mhecker]]></dc:creator><pubDate>Sun, 21 Jan 2007 00:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sun, 21 Jan 2007 03:09:49 GMT]]></title><description><![CDATA[<p>mhecker schrieb:</p>
<blockquote>
<p>Das Sleep(1) ist da, damit die CPU Auslastung nicht bei 100% liegt. Die Funktion wird von einem Thread ausgeführt, das hätte ich vielleicht dazu sagen sollen.</p>
<p>Größere Stücke einlesen geht mit der aktuellen Variante nicht, weil die Datei zur Zeit zeilenweise eingelesen wird. Ich werd auch mal eine der von dir genannten Varianten testen.</p>
<p>Einen schönen Fortschritt konnte ich mit Multithreading erzielen. Statt ~8 Min. braucht das Programm jetzt nur noch ~1 Min..</p>
<p>Grüße,<br />
Michael</p>
</blockquote>
<p>Blubb?<br />
Dir ist schon klar dass Sleep(1) u.U. 15msec oder mehr dauert, ja?<br />
Und dass das bei 1 Mio Zeilen u.U. recht lange werden kann?<br />
Und dass es keinen Sinn macht das Sleep da zu haben - stell den Thread einfach auf normale Priorität, und wenn dir das zu sehr bremst einfach auf &quot;below normal&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213500</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 21 Jan 2007 03:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien einlesen | Das muss doch schneller gehen on Sun, 21 Jan 2007 03:32:03 GMT]]></title><description><![CDATA[<p>Okay, mein Fehler!<br />
Sleep ist raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213501</guid><dc:creator><![CDATA[mhecker]]></dc:creator><pubDate>Sun, 21 Jan 2007 03:32:03 GMT</pubDate></item></channel></rss>