Seite 1 von 2

Daten einer Zeitspanne ohne < > ermitteln

Verfasst: Dienstag 22. August 2006, 06:22
von Michael Schneider
Moin Pythonier,

ich habe mal wieder eine Frage, heute mehr informell als python-spezifisch. Aber ich brauche es für ein Pythonscript, darum wage ich mal, sie hier zu stellen.

Das Problem: Ich habe eine Reihe von Datensätzen (derzeit etwa 17000, ständig wachsend), deren Daten ich schnellen Durchsuchen möchte.

Momentan speichere ich alle Elemente des Datensatzes in separaten Dateien (in denen nur gleiche Attribute stehen) und lasse mir mit UNIX-"grep -i -n -F/E ..." alle Zeilen ausgeben, auf die ein bestimmter String oder RE-Muster passt.
Das funktioniert ausgezeichnet ... solange die Suchstrings bekannt oder die Muster definierbar sind. Ich muss aber auch Daten finden, die in einem bestimmten Zeitraum liegen.

Beispiel:
gespeicherte Daten 105, 95, 107, 120
ich suche alle Daten im Zeitraum 102-110 (incl.)

Ich möchte aus Geschwindigkeitsgründen NICHT erst die Dateien einlesen und dann jedes Element gegen den Zeitraum vergleichen!
Gibt es eine Methode, wie man die Daten speichern kann, so dass man sie über ein Matching einer Zeitspanne zuordnen und finden kann?

Vielen Dank für eure Hilfe,
der Michel

Verfasst: Dienstag 22. August 2006, 06:46
von Masaru
Indexierung könnte eine mögliche Lösung sein ... aber warum selber das Rad neu erfinden, wenn es doch schon Datenbankmanagementsysteme für sowas gibt.

Spricht etwas gegen eine SQLite-DB mit den Daten, über die du dann ein SELECT laufen ließest?

Gerade bei einer größeren Anzahl Datensätzen die - wie du schon so schön sagtest -
ständig wachsend
sind, sind Datenpersistenz und Performance gleichermaßen mit allein einem Dateibasiertensystem sowie einfachen IO-Operatoren nur mit einer gehörigen Portion manuellem Mehraufwand zu realisieren.

Äh .. probiers mal mit SQLite. Die Datensätze müssen natürlich irgendwie in eine DB erstmal hinnein, aber mit Python lässt sich sowas ja recht schnell automatisieren., und 17.000 Records sind auch nicht die Welt (oder sind größere Dateien/Blobs Bestandteile?)
Gruß
>>Masaru<<

Verfasst: Dienstag 22. August 2006, 06:51
von BlackJack
Du suchst eine Datenbank würde ich sagen.

Je nachdem wie die Daten aussehen ist vielleicht auch KirbyBase interessant für Dich.

Verfasst: Dienstag 22. August 2006, 06:58
von gerold
Hi Michael!

Da muss ich Masaru und BlackJack Recht geben. Das ist für eine relationale Datenbank lächerlich einfach und dazu noch viel schneller als du es mit "find" und "grep" je können wirst.

SQLite ist dafür ziemlich gut geeignet. Musst du mit "RE-Mustern" arbeiten, dann würde ich mir aber auch mal PostgreSQL ansehen. Das kann mit "Regular Expressions" ziemlich gut. Allerdings ist der Lernaufwand für PostgreSQL um ein Vielfaches höher als für SQLite.

lg
Gerold
:-)

Verfasst: Dienstag 22. August 2006, 07:01
von Michael Schneider
Hi,

vielen Dank schonmal für die (mehr oder weniger ;)) ausführlichen Antworten!

Ähm, habe ich möglicherweise die Randbedingung vergessen, dass ich eine standard Python2.2 UNIX (HPUX) Installation habe und keine Module (für Datenbanken und dergleichen) installieren lassen kann/darf? Unter anydbm habe ich leider nur die Dummy-Datenbank, deren Effizienz unterirdisch ist (viel Overhead, Datensätze können nur knapp 120 Bytes groß sein, ...).

Ich fürchte ich muss mit dem klarkommen, was mir Python2.2 bietet. :-(

Entschuldigt die weitere Einengung, aber das sind nunmal die Rahmenbedingungen. Ich hoffe, ihr könnt mir trotzdem noch etwas empfehlen.

Grüße,
der Michel

Re: Daten einer Zeitspanne ohne < > ermitteln

Verfasst: Dienstag 22. August 2006, 07:20
von jens
Michael Schneider hat geschrieben:Ich möchte aus Geschwindigkeitsgründen NICHT erst die Dateien einlesen und dann jedes Element gegen den Zeitraum vergleichen!
Gibt es eine Methode, wie man die Daten speichern kann, so dass man sie über ein Matching einer Zeitspanne zuordnen und finden kann?
Wenn es wirklich keine Möglichkeiten gibt, eine DB zu benutzten, mußt du dir wohl quasi selbst eine schreiben...

Unter einem "Standart" Linux ist IMHO MySQL + Python-Modul installiert...

Aber gut, ohne DB könntest du dir einen eigenen "Such-Index" Anlegen. In dem speicherst du nur die Zeit und eine ID/Filename o.ä.
Damit kannst du schnell gezielt nach den Zeiten die Daten finden...

Verfasst: Dienstag 22. August 2006, 07:25
von gerold
Michael Schneider hat geschrieben:Ich fürchte ich muss mit dem klarkommen, was mir Python2.2 bietet.
Hi Michael!

Dann schließe ich mal PostgreSQL und SQLite aus. Beide müssen installiert werden.

BlackJacks Hinweis auf "KirbyBase" dürfte somit keine schlechte Wahl sein. Dafür genügt ein einziges Python-Modul. Allerdings habe ich in der Beschreibung und im Manual keine Hinweise auf irgendeine Art der Indizierung gelesen. Somit muss KirbyBase wahrscheinlich bei jeder Suche alle Daten einer Tabelle sequenziell durchsuchen.

In der "readme.txt" steht allerdings
KirbyBase requires at version 2.3 of Python or greater.
Das muss aber nicht heißen, dass es nicht auch unter Python 2.2 funktionieren könnte. Vielleicht hat der Autor es nur noch nicht ausprobiert.

Ist es wirklich so schwierig, den Admin darum zu bitten, dass er pySQLite installiert? Auch wenn du damit nur ein "altes" pySQLite bekommst, aber wenn du immer mehr Daten bekommst, dann brauchst du einen Index über die Felder, nach denen du suchen musst, sonst wird das Ganze immer langsamer und langsamer.

Obwohl... 100000 Zeilen dürften, glaube ich, auch für KirbyBase noch kein allzugroßes Problem sein. Am Besten du probierst es einfach mal aus.

lg
Gerold
:-)

Verfasst: Dienstag 22. August 2006, 07:26
von Masaru
Hmmm ... keine Module ... och menno :roll:.

Für Python 2.2 gäbe es nämlich auch ein paar [http://initd.org/tracker/pysqlite]SQLite-Versionen[/url] und da ja SQLite dann doch Datei- (oder Memory)basiert arbeitet, müsstest du auch keine weiteren DBMS Installationen durchführen ...

... vorrausgesetzt man darf halt das Paket in sein Lib/site-package Python Verzeichnis entpacken ;).

Hm, was gäbe es sonst für andere Lösungen. Du sagtest, dass der Overhand enorm sein kann.
Heisst das soviel wie: Es werden in zeitlich kurzen Abständen sowohl neue Datensätze erzeugt, wie auch an alten rumgeschraubt (delete, update)?

Was mir ansonsten einfällt, habe ich mal eben schnell aufgelistet (die Arbeit ruft)
  • - die Datensätze in Zyklen cachen und lediglich mit diesen Speicherabbildern arbeiten (so etwas in die Art wie ein Transaktionssystem; hier gilt es natürlich entgegen den Problemen der Nebenläufigkeit und Dateninkonsitenz zu entwickeln)
    - manuell Datensätze mit speziellen Attributen (Referenz und Zeitraum z.B.) in den Speicher und dann zyklisch zur persistenz in Datei(en) indexieren (was aber auch im Modifikationsfalle der Datensätze eine Anpassung deines Indexspeichers erfordern "kann")
    - versuchen auf deine Problemstellung hin einen performanteren Suchalgorythmus schreiben
    - doch vielleich SQLite verwenden ;) (ob man nun selber ein paar Scripte schreibt, oder das TAR-File in den Python Order an die richtige Stelle entpackt ... wo liegt denn da schon der Unterschied ... *pfeif*)
>>Masaru<<

Verfasst: Dienstag 22. August 2006, 07:50
von jens
IMHO muß SQLite (und auch alle anderen Module) nicht zwangsläufig in Pythons Lib/site-package Verzeichnis!
Man kann auch einfach alle Dateien zu seinem Skript packen, so wie man es auch mit eigenen Modulen macht!

Das eigentliche Problem sind Erweiterungen in C, diese müßen richtig kompiliert sein, damit man die benutzten kann und meißt bekommt man ja nur den Sourcecode. I.d.R. bekommt man nur für Windows fertige binaries...

Verfasst: Dienstag 22. August 2006, 08:02
von Masaru
... leider, aber wenn es abgesegnet ist :).

Verfasst: Dienstag 22. August 2006, 10:47
von Michael Schneider
Hi,

es ist wirklich beeindruckend, wieviel geballtes Wissen hier in wenigen Stunden aufgeboten wird. Nochmal ein großes Dankeschön an die Experten!
Masaru hat geschrieben:Hmmm ... keine Module ... och menno :roll:.
Ihr hättet mal die Reaktion sehen sollen, als ich nach Python 2.4 fragte. :D Das mit dem direkten Ansprechen eines Admins ist nicht so einfach. Die Firma, für die ich arbeite und für die ich das Skript schreibe, hat mehrere 10000 Mitarbeiter und ist über einige Länder verteilt. Installationen und Kompilierungen kann ich nicht durchführen.

Wenn ihr mir aber eine Datenbank aus reinem Python-Code empfehlen könnt, wäre das wohl die beste Lösung. Die libs sind lokal, kann ich also erweitern. Aber fertig kompilierten Code möchte ich hier nicht ausführen (müsste ja auch für HPUX kompiliert sein).
Masaru hat geschrieben:Hm, was gäbe es sonst für andere Lösungen. Du sagtest, dass der Overhand enorm sein kann.
Heisst das soviel wie: Es werden in zeitlich kurzen Abständen sowohl neue Datensätze erzeugt, wie auch an alten rumgeschraubt (delete, update)?
Nein, das bezog sich auf die dumb-db. Da kommt man bei größeren Dimensionen zu Nutzdaten:Speicherplatz Verhältnissen von über 1:100 (im Extremfall).
Aber wenn es die Aufgabe vereinfacht: es würde ausreichen, wenn die Daten nur einmal ans Ende geschrieben werden - danach muss man nur noch lesend darauf zugreifen. Neue Stände werden nur angehängt.

Vielleicht ist es wirklich das beste, einmal die Wartezeit des Einlesens hinzunehmen und dann das Änderungsdatum der Dateien im Auge zu behalten - und bei Änderungen die neuen Datensätze einzulesen.

Danke für alles,
der Michel

Verfasst: Dienstag 22. August 2006, 10:56
von gerold
Michael Schneider hat geschrieben:Wenn ihr mir aber eine Datenbank aus reinem Python-Code empfehlen könnt, wäre das wohl die beste Lösung.
Hi Michael!

Und? Was hälst du von KirbyBase, das dir BlackJack bereits vorgeschlagen hat? Hast du so viel Daten, dass du es von vornherein ausschließt?

lg
Gerold
:-)

Verfasst: Dienstag 22. August 2006, 12:00
von Michael Schneider
gerold hat geschrieben:
Michael Schneider hat geschrieben:Wenn ihr mir aber eine Datenbank aus reinem Python-Code empfehlen könnt, wäre das wohl die beste Lösung.
Hi Michael!

Und? Was hälst du von KirbyBase, das dir BlackJack bereits vorgeschlagen hat? Hast du so viel Daten, dass du es von vornherein ausschließt?

lg
Gerold
:-)
Hallo Gerold,

nein, ich hatte nur noch keine Zeit, sie mir anzusehen. :-) Sorry.

EDIT: ein bedauerlicher Umstand, denn KirbyBase scheint GENAU das zu sein, was ich gesucht habe - und davon die Luxusausstattung. :-) Danke nochmal für die Erinnerung und besonders an BlackJack!

Michael

Verfasst: Dienstag 22. August 2006, 12:33
von Michael Schneider
Schade,

KirbyBase importiert das datetime Modul, das erst ab 2.3 verfügbar ist. Da ich es aber nicht brauche, kann ich den Code vielleicht anpassen - aber ob das mit der Lizenz vereinbart werden kann...

Grüße,
Michael

Verfasst: Dienstag 22. August 2006, 13:27
von jens
Da hab ich eine Lösung für dich:
http://www.python-forum.de/post-42481.html#42481
Dach mach ich bei meinem PyLucidCMS:
http://www.pylucid.org/index.py/Doku/In ... OldPython/

Verfasst: Dienstag 22. August 2006, 13:56
von Michael Schneider
Hi Jens,

vielen Dank, mit dem Code müsste es gehen. Ich hatte schon resigniert, weil ich davon ausging, dass ich datetime nur als binary bekommen könnte. :-)

Nochmal zu KirbyBase: ich habe den Code mal überflogen. Wie es aussieht ist die DB zwar sehr komfortabel, liest aber auch jedes mal den gesamten Dateiinhalt ein und zerpflückt ihn. :-(

Grüße,
Michael

Verfasst: Dienstag 22. August 2006, 20:12
von Joghurt
Kannst du deinem Admin nicht fragen, ob der pysqlite für dich installiert? Ist auch kein Clent-Server-System, so dass es keine externen Sicherheitslücken öffnet. Und wenn du ihm die Vorteile nennst, vielleicht hat er ein Einsehen.

Ansonsten soll er dickere Hardware beschaffen, die Wahl hat er ;)

Verfasst: Dienstag 22. August 2006, 23:17
von BlackJack
Was ist mit `gadfly`? Reine Python DB die sogar SQL kann.

Verfasst: Mittwoch 23. August 2006, 06:28
von Michael Schneider
Hi BlackJack,

gadfly? Werde ich mir gleich mal ansehen.

Einen Admin zu erreichen, der was ausrichten kann, benötigt bei uns erfahrungsgemäß mindestens zwei Anträge, fünf Formulare und gute Französischkenntnisse ;-). Aber versuchen kann man vielleicht auch das mal.

Grüße,
Michael

Verfasst: Samstag 26. August 2006, 17:53
von Michael Schneider
Hi,

gadfly funktioniert bislang einwandfrei unter python 2.2. Ich habe mich jetzt für die Umsetzung damit entschieden. So kann ich das Zeitcheckproblem direkt mit der SQL-Formulierung:
"where ZEITPUNKT between STARTZEIT and ENDZEIT"
erschlagen. Nochmals danke, BlackJack!

Und natürlich allen, die ihren hilfreichen Senf dazu gegeben haben.
Michael