<?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[frage zum suchen in grossen text-dateien]]></title><description><![CDATA[<p>folgende frage:</p>
<p>bei einer aufgaben-stellung wie</p>
<p>- es sind grosse (mehrere 100MB) textdateien nach suchmustern zu scannen<br />
(suchmuster sind reine strings oder regulaere ausdrücke (ggf. multi-line)<br />
- es ist c++ mit standard libs (STL, BOOST) ggf. QT zu verwenden<br />
- suchanfragen bei obiger datei-groesse duerfen auf einem &quot;normalen&quot;<br />
pc (3000+GHz CPU, 1GB Ram) nicht zu lange dauern (im sekunden-bereich)</p>
<p>Hat jemand schonmal erfahrungen zu solch einem vorhaben gesammelt ?<br />
Interessant waeren fuer mich herangehensweisen, die obiges moeglicht<br />
elegant/effizient loesen koennen. ich moechte mir einen ueberblick<br />
ueber die moeglichkeiten mit ggf. vor- nachteilen verschaffen.<br />
konkret geht es um ein vorhaben, ggf. einen logfile scanner mit obigen<br />
anforderungen zu schreiben.</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310869/frage-zum-suchen-in-grossen-text-dateien</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 07:52:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310869.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Nov 2012 16:11:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Wed, 21 Nov 2012 16:11:42 GMT]]></title><description><![CDATA[<p>folgende frage:</p>
<p>bei einer aufgaben-stellung wie</p>
<p>- es sind grosse (mehrere 100MB) textdateien nach suchmustern zu scannen<br />
(suchmuster sind reine strings oder regulaere ausdrücke (ggf. multi-line)<br />
- es ist c++ mit standard libs (STL, BOOST) ggf. QT zu verwenden<br />
- suchanfragen bei obiger datei-groesse duerfen auf einem &quot;normalen&quot;<br />
pc (3000+GHz CPU, 1GB Ram) nicht zu lange dauern (im sekunden-bereich)</p>
<p>Hat jemand schonmal erfahrungen zu solch einem vorhaben gesammelt ?<br />
Interessant waeren fuer mich herangehensweisen, die obiges moeglicht<br />
elegant/effizient loesen koennen. ich moechte mir einen ueberblick<br />
ueber die moeglichkeiten mit ggf. vor- nachteilen verschaffen.<br />
konkret geht es um ein vorhaben, ggf. einen logfile scanner mit obigen<br />
anforderungen zu schreiben.</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273124</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Wed, 21 Nov 2012 16:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Wed, 21 Nov 2012 16:20:50 GMT]]></title><description><![CDATA[<p>Das haengt stark davon ab, wie die Datei aufgebaut/formatiert sind. Wenn das ne ordentlich Struktur hat und das Suchmuster klar definiert ist, dann geht das ruckzuck. Ein Logfile sieht klar strukturiert aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273127</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Nov 2012 16:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Wed, 21 Nov 2012 16:30:05 GMT]]></title><description><![CDATA[<p>ok, jedoch im speziellen bei regulaeren ausdruecken, die ggf. im multi-line<br />
modus gesucht werden sollen, kann das vielleicht schon etwas schwieriger werden.</p>
<p>was mich interessieren wuerde (besonders beim multi-line scanning, also bei der suche nach mustern, die sich ueber mehrere zeilen erstrecken) wie man da dann das file-handling umsetzt:</p>
<p>datei-inhalt muesste erstmal in eine geeignete datenstruktur eingelesen werden, die dann der entsprechenden such-engine uebergeben werden kann.<br />
bei mehreren 100MB einen riesen-string draus zu machen erscheint mir bedenklich.</p>
<p>ich bin auf der suche nach bekannten (standard) mustern, wie man sowas machen koennte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273131</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Wed, 21 Nov 2012 16:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Wed, 21 Nov 2012 17:16:33 GMT]]></title><description><![CDATA[<p>Darfst du vorverarbeiten?<br />
(Vorverarbeitung heißt du kriegst die Textdatei und konvertierst die in irgendwas. Nachdem du damit fertig bist beginnt die Zeitmessung und du bekommst Suchanfragen. Ohne Vorverarbeitung heißt die Zeitmessung startet mit der Übergabe der Textdatei.)</p>
<p>Wenn du nicht Vorverarbeiten darfst und der Inhalt der Textdatei völlig unbekannt ist bietet sich der KMP an. Das ist quasi der Standard-Stringmatcher. Er kann nach beliebig vielen Suchmustern inklusive einigen (allen?) regulären Ausdrücken in O(n) suchen.<br />
Er ist nur durch Boyer-Moore-artige Algorithmen zu schlagen, wenn es sehr wenige Treffer, ein großes Alphabet und nur eine Suchanfrage gibt.<br />
Wenn der Inhalt der Textdatei teilweise bekannt ist (Es ist eine Logdatei der Form ...) lässt sich wahrscheinlich darauf optimieren.</p>
<p>Mit Vorverarbeitung bietet sich eine Indexstruktur an (reverse index oder so), wo du für jedes Wort oder besser für jede mögliche Suchanfrage eine Liste der Textstellen angibst und bei der Suchanfrage einfach nur in der Liste den Eintrag mit den Ergebnissen abliest.</p>
<p>Ich verstehe nicht was du mit Multiline Scanning meinst. Das Newline-Zeichen ist ein Zeichen wie jedes andere auch. Oder steht in der Aufgabenstellung dass das besonders behandelt werden muss?</p>
<p>Beim File-Handling würde ich einfach etwa ein kB Speicher nehmen, per fread die Datei kB-weise einlesen und den KMP drüber rattern lassen. Wenn du noch ein Bienchen willst, kannst du 2 Threads machen und den einen einlesen lassen während der andere auswertet (2 Buffer). Wahrscheinlich bringt das aber wegen Readahead-Tricks des Betriebssystems eh nichts. (und meist werden bei solchen Aufgaben nicht die Echtzeit, sondern die Rechenzeit gemessen, sodass Multithreading kontraproduktiv ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273146</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 21 Nov 2012 17:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Wed, 21 Nov 2012 17:36:52 GMT]]></title><description><![CDATA[<p>Ein paar Fragen, um das genauer beantworten zu können:<br />
Welchen Umfang hat das Alphabet, aus dem die Textdateien bestehen?<br />
Welche Länge haben deine Suchpattern? (ungefähr)<br />
Wieviele Pattern möchtest du suchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273147</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Nov 2012 17:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to frage zum suchen in grossen text-dateien on Thu, 22 Nov 2012 23:00:10 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>bei einer aufgaben-stellung wie</p>
<p>- es sind grosse (mehrere 100MB) textdateien nach suchmustern zu scannen<br />
(suchmuster sind reine strings oder regulaere ausdrücke (ggf. multi-line)</p>
</blockquote>
<p>Hallo pepe75,</p>
<p>also bei der Größe lohnt es sich auf die streambuf-Ebene abzusteigen. Wie das geht, da gibt es <a href="http://www.c-plusplus.net/forum/p2267197#2267197" rel="nofollow">hier</a> schon ein Beispiel im Forum. <a href="http://www.c-plusplus.net/forum/p2256837#2256837" rel="nofollow">Hier</a> gibt es noch ein paar Erläuterungen dazu.<br />
Für einen eine einfachen 'grep' (suche eine Zeichenfolge) kann man dann einen search-Algorithmus bauen. Der <a href="http://www.cplusplus.com/reference/algorithm/search/" rel="nofollow">std::search</a> setzt leider <a href="http://www.cplusplus.com/reference/std/iterator/ForwardIterator/" rel="nofollow">Forward-Iteratoren</a> voraus, aber wenn man direkt aus einer Datei liest, so hat man nur <a href="http://www.cplusplus.com/reference/std/iterator/istreambuf_iterator/" rel="nofollow">istream_buf-Iteratoren</a> - also Input-Iteratoren - zur Verfügung. D.h. diesen search müsste man sich selber schreiben.</p>
<p>So nach den ersten Tests komme ich auf ca. 1s/100MB Suchgeschwindigkeit - schnell genug?.</p>
<p>In wie weit das <a href="http://www.cplusplus.com/reference/std/regex/" rel="nofollow">std::regex</a> mit <a href="http://www.cplusplus.com/reference/std/iterator/InputIterator/" rel="nofollow">input-Iteratoren</a> zurecht kommt weiß ich (noch!) nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273642</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 22 Nov 2012 23:00:10 GMT</pubDate></item></channel></rss>