Seite 1 von 1

DB-artiger Zugriff auf Dateien

Verfasst: Dienstag 6. März 2007, 16:23
von nkoehring
Hallo...

ich bin gerade am Gruebeln, wie ich es anstellen soll, User performant zu verwalten.

Also bisher ist der Plan wie folgt...

Ein Datensatz der Datei ist in dieser Struktur aufgebaut:

Code: Alles auswählen

{'username': {dictionary, mit, daten, des, users, [liste, mit, gruppen, des, users]}}
Da die Datei nun ein Dictionary ist, verwende ich einfach cPickle zum speichern und laden... soweit alles kein Problem. Aber ich wuerde es gern so haben, dass ich nicht die ganze Datei zu laden habe, nur um an einen einzigen Datensatz zu kommen.

Wie koennte das nun anstellen? Ich haette bereits diverse Ideen... aber wie gut die nun am Ende sind weiß ich nicht.

Zum Bsp koennte ich anstelle des Dictionarys einen Datensatz einfach so machen:

Code: Alles auswählen

[username, {datendictionary}]
Dann wuerde ich die Datei einfach Datensatz fuer Datensatz (Zeile fuer Zeile) durchsuchen bis ich den richtigen habe.

Viel lieber waere mir aber eine Assoziativitaet zw Zeilennummern und Datensaetzen. Dann braeuchte ich allerdings nen Weg, direkt in Zeilennummer X zu springen, ohne aber die Laenge jeder Zeile zu wissen. Außerdem wuerden Luecken auftauchen, wenn ich User loesche.

Was fuer Ideen gaebe es denn noch? Vielleicht gibts ne viel einfachere Loesung, die ich nicht kenne?

PS: Ich moechte ungern ein extra DBMS verwenden muessen. Außerdem komme ich mit der Idee, fuer jeden Datensatz extra eine Datei anzulegen auch nicht so recht ueberein.

Verfasst: Dienstag 6. März 2007, 16:32
von Bastl
http://www.python-forum.de/topic-6157.html

Vielleicht hilft dir das weiter.
Vielleicht kannst du dich auch mit pySQLite anfreunden. Ist meiner Meinung nach sehr einfach zu integrieren.
Oder muss es zwingend eine Datei sein?

Verfasst: Dienstag 6. März 2007, 16:35
von nkoehring
was genau macht den pySQLite... ich wollte meine Loesung so unabhaengig von anderen Dingen, wie moeglich halten. Bisher belaufen sich meine "Abhaengigkeiten" auf Karrigell und BeautifulSoup ...beides kann ich so wie es ist, mitgeben und muss es nicht extra installieren lassen.

EDIT:shelve klingt da ja mal ziemlich interessant...

Verfasst: Dienstag 6. März 2007, 20:30
von Bastl
Sofern du Python 2.5 benutzt ist das auch dabei.

Verfasst: Mittwoch 7. März 2007, 13:50
von Y0Gi
Sobald es um schnellen Zugriff und spezielle Abfragen geht, macht sich ein RDBMS schon gegenüber Flatfiles/Marshalling bezahlt. Wenn du aber noch nicht an die Grenzen gestoßen bist, kannst du es natürlich wie bisher belassen - und dann immer noch Umsteigen und dabei erkennen, warum das sinnvoll ist.

Verfasst: Mittwoch 7. März 2007, 15:58
von gerold
Y0Gi hat geschrieben:Sobald es um schnellen Zugriff und spezielle Abfragen geht, macht sich ein RDBMS schon gegenüber Flatfiles/Marshalling bezahlt.
Hi!

Kaum etwas ist schneller als der direkte Zugriff auf Textdateien. -- Vorausgesetzt du weißt wo diese Textdatei liegt und wie sie heißt. Da kann keine Datenbank mithalten.

Wenn ich also eine Textdatei in einen Ordner schreibe, und in diese Textdatei ein paar Zeilen Text rein schreibe, dann kann ich sehr schnell auch wieder auf diesen Text zugreifen und diesen auslesen. Eine Datenbank hätte in solchen Fällen keinen Vorteil und wäre sogar langsamer.

Wenn ich also Daten habe, die ich nur über einen Schlüssel (z.B. den Dateinamen) ansprechen und finden muss, dann ist die Ablage im Dateisystem keine schlechte Wahl. Die Dateisysteme sind hoch optimiert und finden die Speicheradressen einer Datei sehr schnell.

Shelve bringt in manchen Fällen sogar noch einen Geschwindigkeitsvorteil, da die Datei offen gehalten wird und die Speicheradressen der Daten von Shelve selber verwaltet werden und die Datei nicht mehr im Dateisystem gesucht werden muss. (Dateifragmentierung ausgeschlossen)

Eine Datenbank bringt etwas, wenn ich auf Daten nicht nur über einen eindeutigen Schlüssel zugreifen kann. Z.B. Adressen. Abfragen wie "Gib mir alle Adressen, deren Ort "Innsbruck" ist und deren Nachnamen mit "M" beginnen. Solche Abfragen sind ein leichtes für Datenbanksysteme, aber extrem aufwändig für reine Textdateien. Diese müssten im Normalfall alle durchsucht werden und das kostet Ressourcen.

"Gib mir alle Personen zurück, die in den letzten 30 Tagen bei mir eingekauft haben"... --> Für eine Datenbank kein Problem. Für Dateien im Dateisystem müsste man sich das alles selber programmieren. -- viel zu aufwändig!

Wenn die Datenmenge klein ist und bleiben wird oder wenn sicher ist, dass auf die Daten immer nur über einen Schlüssel zugegriffen werden soll, bringt eine Datenbank keine Vorteile.
Ich glaube sogar, dass in solchen Fällen die Verwendung von Datenbanken sich nachteilig auf die Geschwindigkeit und auf die Dauer der Programmierung auswirkt.

Wenn ich glaube, dass meine Anwendung wachsen wird und es in Zukunft mehr Daten, verschiedenste Daten und jetzt noch nicht vorhersehbare Daten geben wird, dann setze ich auf eine Datenbank -- auch wenn am Anfang das Datenaufkommen noch nicht dafür spricht. SQLite ist dafür sicher keine schlechte Wahl.

So, genug geschrieben...

mfg
Gerold
:-)

Verfasst: Donnerstag 8. März 2007, 14:55
von Y0Gi
Gut, da habe ich mich vielleicht schlecht ausgedrückt. Es ging mir auch darum, dass RDBMS über Dinge wie Indizes und Implementierung von Binärsuchbäumen und dergleichen verfügen, die man für eigene Flatfiles ungern selbst programmieren möchte. Bei größeren Datenmengen wird der Zugriff über ein DBMS also schneller, weil da schon durchdachte Verfahren zur Haltung und Durchsuchung der Daten implementiert sind.

Relevant ist letztlich immer die Aufgabe/Situation, für die die eine oder andere Lösung eben besser/schlechter geeignet ist, weil sie mehr/weniger "Drumherum" von Haus aus mitbringt. Weniger ist hierbei aber nicht unbedingt schlechter, Overkill sollte vermieden werden.

Verfasst: Donnerstag 8. März 2007, 15:05
von jens
Möchte nur mal so in den Raum werfen, das z.B. django da was fertiges hat:

http://www.djangoproject.com/documentat ... cial-cases
http://www.djangoproject.com/documentat ... o-filename

Ich hab selber noch nicht damit gearbeitet und die Doku ist dahingegend etwas dünn. Aber ich stelle mir das so vor, das man in den DB einen Eintrag für jede Datei hat, die Datei selber wird jedoch im Dateisystem hinterlegt. Dennoch kommt man an die Daten über die DB ran. Das Regelt dann django für einen...

Verfasst: Donnerstag 8. März 2007, 16:35
von Y0Gi
Ja und? Soll er jetzt das fette Django in seine kleine Applikation stopfen?

Verfasst: Donnerstag 8. März 2007, 16:45
von jens
Will damit sagen, das es durchaus nicht Praxisfern ist, wenn man das mit z.B. SQLite machen würde, die Dateien aber in's Dateisystem schmeißt ;)

Verfasst: Donnerstag 8. März 2007, 16:57
von nkoehring
Hallo... und danke erstmal fuer die vielen Beitraege :D

Also ich denke, dass Gerold mir bereits alle Antworten liefern konnte, denn es geht mir weniger um komplexe Suchmuster, als um stupides Auslesen kompletter Datensaetze. Nur dieser soll eben schnell gefunden sein.

Zu "suchen" ist nur der User... habe ich also einen Login, wird mein Programm in der Datendatei den entsprechenden Datensatz raussuchen und umsetzen. Das war alles. Die Suche sieht (dank Shelve) nun ungefaehr so aus:

Code: Alles auswählen

return _userdb[username][3]
... und ist somit ziemlich einfach fuer mich und hoffentlich auch noch schnell wenn es mal mehr als ein Admin und drei Testuser sind ;)

Danke trotzdem fuer all die Suggestionen...
...und Gruesse aus Sachsen-Anhalt