Ich hab eine recht lange Textdatei (4MB) aus der ich Dinge auslesen und benutzen möchte. Da sich der Inhalt nicht ändern wird, dachte ich, es sei vielleicht sinnvoll eine Datenbank anzulegen, einmal alles da rein zu packen und mir später das auslesen des Textes zu sparen. Da erstmal die Frage, warum es so viel schneller, Dinge aus einer Datenbank auszulesen ist (ist es?), als einfach eine neue Textdatei anzulegen, in den ich die für mich interessanten Teile schreibe? Auf die Festplatte muss ja in beiden Fällen zugegriffen werden, das einzige was ich mir vorstellen kann, ist, dass man, braucht man nur bestimmte Daten, beispielsweise die auf Zeile 20 im Text erst durch Zeile 1-19 gehen muss (zumal, wenn man die Zeilennummer gar nicht kennt...).
In meinem Perlbuch ist dbmopen beschrieben, ich hab allerdings Fehler bekommen, die ich nach ein bisschen suchen darauf zurückführe, dass ich einen mehrdimensionalen Hash in meine Datenbank bauen wollte, in der Perldoc hab ich zwar schon gefunden, dass ich MLDBM benutzen sollte, womit ich mich noch auseinandersetzen werde, aber mir ist dabei aufgefallen, dass man hier fast nichts über DBM findet. Im
Tutorial Kapitel 9 stehen sie zwar im Inhaltsverzeichnis, werden dann aber nicht beschrieben,
hier und
hier gibt es ein paar falsche links (das Datenbankforum und das MySQL-Teil. Man findet nur viel spezielleres Zeug zu DBI und MySQL, wobei ich nicht weiß, was das genau ist (ich schätze Datenbanken, aber sonst...*g). Ist DBM veraltet, oder so?
Ein zweites etwas konkreteres Problem hab ich bei dem Erstellen der Datenbank. Ich will das ja nur einmal machen, also dachte ich, ich überprüfe mit -e, ob sie schon vorhanden ist. Da dieses Script aber auch auf Windows laufen soll (normalerweise benutz ich die Scripte nur auf Linux), müsste ich ja unterschiedliche Dateien überprüfen, da die auf beiden Systemen (oder von beiden Linuxversionen) unterschiedlich abgelegt werden. Das wäre an sich kein Problem, aber ich dachte, ich mach es geschickter und schreibe:
my %XYZ;
unless (dbmopen (%XYZ,"name",undef)){
dbmopen (%XYZ,"name",0644);
mach was;
}
Ich dachte, wenn die Datei nicht existiert, kann sie wegen "undef" nicht erstellt werden und ich mach das, was in den geschweiften Klammern steht. (Sagt man in der "Bedingung"? Ne...) Das stand natürlich so nicht im Buch. Mit der Warnung über einen nicht initialisierten Wert in der Null-Operation kann ich nicht so viel anfangen...wie mache ich sowas am geschicktesten, oder bleibt nur alle möglichen Dateiendungen zu überprüfen?
Zu guter letzt, ist der Zugriff auf einen Array-Wert eigentlich immer schneller als auf einen Hash-Wert? Immerhin sind bei ersterem die "Schlüssel" ja sortiert. Ich dachte nur, da die Festplatte ja um einiges langsamer ist wäre es (im Endeffekt wohl nicht merkbar, aber darum geht's ja nicht ;) vielleicht schneller auf $XYZ{"key"}[0] als auf $XYZ{"key"}{"null"} zuzugreifen...
Edit: Mein unless-Konstrukt geht eigentlich, ich hatte nur nicht viel mehr gemacht als das und dachte die ausgegebene Warnung wäre ein Programmabbruch. Trotzdem bräuchte er da eigentlich auch nicht warnen...
Last edited: 2010-08-12 15:22:36 +0200 (CEST)