Ich habe vor ein paar Tagen meine Hände an eine Text-Datei bekommen mit mehreren Millionen Zeilen darin. Die Datei hat eine Größe von guten 300MB und besitzt eigentlich nur URLs drin.
Jetzt bin ich auf die glorreiche Idee gekommen dass ich diese Datei in eine MySQL-Datenbank schreibe und dort ein wenig kategorisiere. Dass ich dafür eine Weile brauchen werde war mir allerdings von Anfang an bewusst.
Auslesen und Speichern
Das reine Auslesen und Speichern in der DB hat nur wenige Sekunden gedauert, inklusive der Erstellung eines Skriptes dafür:
set_time_limit(0); $connect = mysql_connect('localhost', 'root', ''); mysql_select_db('worddb'); $count = 0; $file = fopen('worddb.txt','r'); while (!feof($file)) { $line = fgets($file); mysql_query('INSERT INTO urls (url) VALUES ("' . mysql_real_escape_string($line) . '")'); $count++; if ($count%1000 == 0) { echo 'count: ' . $count . "\n"; } }
Auf irgendwelche Kommentare habe ich mal verzichtet, das Skript sollte sich von alleine erklären.
Kategorisierung der URLs
Um die ganzen URLs in etwas kleinere Tabellen aufzuteilen gibt es ein weiteres Skript der Marke “quick, dirty, no comment”:
set_time_limit(0); $connect = mysql_connect('localhost', 'root', ''); mysql_select_db('worddb'); $count = 0; $result = mysql_query('SELECT url FROM urls'); while ($row = mysql_fetch_assoc($result)) { $count++; if ($count%1000 == 0) { echo 'count: ' . $count . "\n"; } if (false !== strpos($row['url'], '.blogspot.com')) { mysql_query('INSERT INTO blog_blogspot (url) VALUES ("' . mysql_real_escape_string($row['url']) . '")'); mysql_query('DELETE FROM urls WHERE url="' . mysql_real_escape_string($row['url']) . '"'); continue; } if (false !== strpos($row['url'], '.wordpress.com')) { mysql_query('INSERT INTO blog_wordpress (url) VALUES ("' . mysql_real_escape_string($row['url']) . '")'); mysql_query('DELETE FROM urls WHERE url="' . mysql_real_escape_string($row['url']) . '"'); continue; } }
Die Kurzversion mit nur 2 möglichen “Standard-Hosts”. Wirklich haben tu ich da ein paar mehr, und wenn keiner gefunden wurde gibts noch eine Kategorisierung nach TLD. Alles in Allem sind das so 25 strpos-Abfragen.
Moral der Geschichte
Weil ich zu faul war mir das Programm in Qt zu schreiben und lieber fix was in PHP gebastelt habe wird das Ding wohl ein paar Tage laufen dürfen. Außer ich schieße den Prozess ab und verwende doch eine auf Qt (oder gleich reines C++) basierende Variante. Oder ich besorge mir einen schnelleren Rechner, oder verwerfe meine Ideen was ich mit der Datenbank anstellen könnte…
(Na gut, letzteres kommt einfach nicht in Frage…)
- Andere Blogs die über Textdatei In Datenbank schreiben
- Textdateien erstellen, auslesen und löschen – Die Tipps-Datenbank
- Firefox 3 und cookies.txt – 0×7be
Keine verwandten Beiträge gefunden.
Kein(e) Kommentar(e)