Daten einer Zeitspanne ohne < > ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
BlackJack

Du suchst eine Datenbank würde ich sagen.

Je nachdem wie die Daten aussehen ist vielleicht auch KirbyBase interessant für Dich.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Zuletzt geändert von Masaru am Dienstag 22. August 2006, 08:05, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... leider, aber wenn es abgesegnet ist :).
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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 ;)
BlackJack

Was ist mit `gadfly`? Reine Python DB die sogar SQL kann.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten