Fragen zu Python Suchfunktion für json Dateien (große Dateimengen):

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.
Antworten
Xam
User
Beiträge: 4
Registriert: Dienstag 10. Oktober 2023, 00:43

Hallo erstmal,

Vl. kann mir hier einer mit ein paar Fragen weiterhelfen?

Also ich bin was Python betrifft noch ein ziemlicher Anfänger, wollte mich aber jetzt mal in das Thema reinarbeiten. Ich hab hier eine Reihe von json Dateien (mit je ein paar Millionen Einträgen), die ich gerne auf verschiedene Zeichenketten, Strings, Werte oder Wörter durchsuchen würde. Hab dafür auch schon das *passende* Python Script, leider jedoch alles etwas unübersichtlich. Das Script kann anscheinend mit einem Klick sämtliche json Dateien in einem Verzeichnis, die als Rar Archive komprimiert sind auch im komprimierten Zustand durchsuchen. Dazu erst mal die Frage ob das überhaupt so ideal ist oder ob es für eine höhere Geschwindigkeit / Performance besser (oder schlechter?) wäre die ganzen Dateien zu entpacken oder gar in SQL-Tabellen umzuwandeln? (es sollen bis zu 100 solcher json-Files mit mehreren Millionen Einträgen gleichzeitig durchsucht werden). Das Nächste wäre (ich weiß evtl. komplette Anfängerfrage): Wie führe ich dieses Python Script nun so aus, dass es das macht was es kann und ich die ausgegebenen Ergebnisse z.b als Tabelle mit Text präsentiert bekomme? Per CMD? Oder muss noch etwas separat installiert werden? Ich hatte schonmal mit Pythondateien zutun, allerdings lief das alles zusammen mit ner Datenbank und weiteren PHP-Scripten auf nem Onlinewebspace. Ein PHP-Script ist jetzt hier allerdings nicht dabei... Ich wollte das Ganze jetzt mal zuerst nur manuell auf meiner lokalen Windowsmaschine laufen lassen und erst später auf dem Webspace eines Servers. Aktuell liegt alles schon in einem Verzeichnis bereit und ich kann die .py datei, welche diese Such-Funktion ausführen soll auch öffnen (und den Quelltext verändern), aber wie geht es nun weiter?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher hast Du das Pythonskript? Da sollte es ja eigentlich eine Dokumentation und Installationsanweisung geben.
Im Normalfall installiert man ein Pythonskript mit allen Abhängigkeiten per `python -m pip` wenn es als pip-Paket vorliegt und startet es in einer Konsole.

Alles weitere hängt stark davon ab, was das für eine Skript ist, was das schon kann, und wieviel Du noch selbst schreiben möchtest.
So wie es sich anhört, sollten die json-Dateien nur dafür benutzt werden, die Daten in eine SQL-Datenbank einzupflegen. Ob das das Skript kann ????

Und wenn Du das irgendwie Online zugreifbar machen möchtest, hängt das wieder davon ab, was da konkret passieren soll. Nur soviel: entweder hat man eine reine PHP-Webseite die auf die Datenbank zugreift, oder man hat alleine einen Pythonwebserver. Beides mischen sollte man nicht.

Wenn da aber nichts *passendes* dabei ist, wird das auf jedenfall viel Arbeit.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

bzgl.
Das Script kann anscheinend mit einem Klick sämtliche json Dateien in einem Verzeichnis, die als Rar Archive komprimiert sind auch im komprimierten Zustand durchsuchen. Dazu erst mal die Frage ob das überhaupt so ideal ist oder ob es für eine höhere Geschwindigkeit / Performance besser (oder schlechter?) wäre die ganzen Dateien zu entpacken
Python kann mit Bordmitteln keine RAR-Archive entpacken, d.h. dein Skript hat mindenstens eine externe Abhängigkeit zu einem Python-Modul, dass das erledigt.

Im komprimierten Zustand kann i.d.R. nichts durchsucht werden. Was das Skript wahrscheinlich macht ist, dass RAR-Archiv ins RAM zu entpacken und dann zu durchsuchen. Das sollte eigentlich kein Nachteil bzgl. Geschwindigkeit sein.

Beim Einlesen werden JSON-Datenstrukturen in Python Datenstrukturen umgewandelt, also JSON-Array -> Python Liste, JSON Object -> Python Dict usw. Das Durchsuchen dieser Datenstrukturen ist schon relativ effizient. Ob sich ein Schreiben in eine SQL-Datenbank (z.B. SQLite) lohnt oder nichr hängt maßgeblich davon ab, was wie abgefragt werden soll. Also z.B. ob es Abfragen mit mehreren Suchbedingungen gibt, es es evtl. verknüpfte Abfrage etc.

Kannst du das Python-Skript überhaupt ausführen? Also führt der Aufruf von `python name_des_skripts.py` dazu, dass das Skript durchläuft (und ggf. was ausgibt) oder bekommst du eine Fehlermeldung?

Gruß, noisefloor
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also das ein entpacken kein Geschwindigkeitsnachteil bedeutet, kann ich mir nicht vorstellen. Solange rar nicht schneller entpackt, als die rohen Daten in den Speicher zu laden. Was nicht fuer seine Kompressionsfaehigkeiten spraeche. Und vor allem wird das wahrscheinlich auch unter zurhilfenahme von winrar/unrar passieren, also einfach temporaer entpacken, und dann laden.

Auch was die Abfrageeffizienz angeht, bin ich nicht ganz bei dir. Klar, im Speicher ist schon ziemlich schnell, aber auch bei einer einzelnen Abfrage kann ein Index enorme Geschwindigkeitsvorteile bringen. Natuerlich zu den Kosten, den einmalig zu erzeugen, das also immer wieder neu zu machen, lohnt sich eher nicht.

@Xam: hier braucht es noch deutlich mehr Informationen, um eine Beurteilung des Systems und potentieller Verbesserungen vorzunehmen.
Xam
User
Beiträge: 4
Registriert: Dienstag 10. Oktober 2023, 00:43

OK, also ich schreib jetzt am Besten einfach mal was dieses Script können soll:
Die JSon Einträge sind relativ viele, insgesamt ist das Projekt bereits mehr als 20 GB groß und kann noch deutlich anwachsen (pro Json Datei sind es ca. 50MB) und das allein im gepackten Zustand. Da ich ein Großteil der Dateien gleichzeitig durchsuchen möchte ist ein Laden per RAM dann wahrscheinlich eher ungeeignet und würde maximal gestaffelt funktionieren? Die Dateien zu entpacken und auch SQL-Tabellen daraus zu erstellen wären jedoch kein Problem. Ich müsste lediglich wissen was hier am Besten / Schnellsten / Stabilsten funktioniert oder ob Python hier überhaupt die richtige Wahl ist? (Einer mit dem ich gesprochen habe hat mir z.b bereits recht deutlich von Python abgeraten...)

Die Struktur der Json Dateien ist aktuell (leicht vereinfacht) in allen Files ungefähr Folgendermaßen aufgebaut:
{"Var1":"Text1.a","Var2":"Text1.b","Var3":"Wert1","Name":"Attribut0001","IsActive":"true",....}
{"Var1":"Text2.b","Var2":"Text2.b","Var3":"Wert2","Name":"Attribut0002",IsActive":"false",....}
{"Var1":"Text2.c","Var2":"Text2.c","Var3":"Wert3","Name":"Attribut0003",IsActive":"true",....}
{"Var1":"Text2.d","Var2":"Text2.d","Var3":"Wert4","Name":"Attribut0004",IsActive":"true",....}

wobei die Zahl der Variablen teilweise variiert und manchmal zwischen 50-100 je Zeile beträgt. Was dieses Script jetzt können soll ist in erster Linie einzelne dieser Variabelspalten in diversen Dateien, die sich sagen wir mal in einem bestimmten Verzeichnis befinden zu durchzusuchen.
Also z.b soll "Var1", "Var2" oder "IsActive" in allen Zeilen nach bestimmten, allen oder definierbaren Wörtern, Werten oder Zeichenketten durchsucht werden und das Ergebnis als Liste / Tabelle mit jeweils allen zutreffenden Zeilen ausgegeben werden. Ggf. sollen auch mehrere Suchen parallel getätigt, alle Werte einer Spalte ausgegeben und redundante doppelte Werte eliminiert oder Werte ausgeschlossen werden können. Bereits getätigte Suchen sollen (wenn sich das lohnt) neu indexiert werden und in separate Dateien oder Tabellen geschrieben werden. Ggf. soll es auch möglich sein, nur definierte Teilbereiche oder einzelne Files nach Randomprinzip zu durchsuchen.

Ich schätze mal, dass so ein Script wahrscheinlich mehr oder weniger bereits existiert und jetzt nicht erst komplett neu erfunden werden muss?

Wichtig wäre also in erster Linie zu wissen wie ich strukturell vorgehe. 400 json Files für den Anfang (Zahl der Files und Variablen wird möglicherweise noch anwachsen) in jeder stehen durchschnittlich 250.000 und sagen wir max. 2 Millionen Zeilen Text wie oben. Entpacken wird wahrscheinlich notwendig sein was ich aber manuell erledigen kann. Zu klären wäre direktes auslesen der .json oder Unwandlung in ein anderes Format wie SQL oder weitere Aufteilung der Files zb nach einzelnen Variablen. Eine Suchanfrage soll in jedem Fall so schnell und stabil wie möglich laufen und sich letztendlich auch automatisieren lassen. Also im Idealfall deutlich unter 1 Minute betragen...?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommen die Daten? Das Schreiben in eine Datenbank braucht viel Zeit, das Lesen geht danach viel schneller. Also wenn die Daten sich langsam ändern und es viele Abfragen gibt, lohnt sich das, sonst nicht.

Wie Du strukturell vorgehen sollst, ist eigentlich egal, weil der erste Ansatz nur so lange funktioniert, bis Du an eine Grenze stößt und dann weißt, warum es nicht geht um dann mit einem neuen Ansatz neu zu starten. Erster Schritt wäre, unabhänig von Deinem aktuellen Problem, Dich in SQL-Datenbanken einzuarbeiten. Dass Du bei SQL immer von einem "Format" sprichst, zeigt, dass da noch Wissen fehlt.
Xam
User
Beiträge: 4
Registriert: Dienstag 10. Oktober 2023, 00:43

Die Daten kommen zu 99% aus den json-Files und ändern sich nach dem Schreiben nicht mehr. Es kommen lediglich laufend neue Tabellen / Daten dazu...
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Xam: Als Verständnisfrage: Du hast eigentlich JSON Lines-Dateien und keine ”normalen” JSON-Dateien‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommen die Dateien?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

__blackjack__ hat geschrieben: Donnerstag 12. Oktober 2023, 01:07 @Xam: Als Verständnisfrage: Du hast eigentlich JSON Lines-Dateien und keine ”normalen” JSON-Dateien‽
Das war auch mein erster Gedanke. Mein zweiter war, dass es sich hier eigentlich um tabellarisch geordnete Zeichenketten handelt. „true“ spräche dafür und die gleiche Struktur der Zeilen. Einen CSV-Import ist in der Regeln mit Bordmitteln der DB möglich.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir fehlen da immer noch Details zu den Abfragen. Deren Haeufigkeit im Verhaeltnis zu neuen Daten, ob welcher Art die Abfragen sind (einfach Praedikate auf einer Zeile, aggregieren die etwas), etc. Da wirst du noch weiter ausholen muessen in meinen Augen. Wobei zumindest mal einen Datenbank-Import als Experiment, und dann zB ein SQL-Frontend fuer die Abfragen - das koennte man mal ausprobieren.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Ich will auch mal eine NoSQL-Datenbank in den Ring werfen: MongoDB. Die behandelt ihre Datensätze (sog. Documents) nach außen wie JSON. Damit ist ein Import sehr einfach. Das würde auch die scheinbar nicht einheitliche Struktur abdecken. Abfragen kannst du die Daten mit pymongo oder mongoengine oder mit dem MongoDB Compass. Nichtsdestotrotz gelten die Vorschläge der anderen: Schau erst mal, das da wirklich vorliegt und was genau damit gemacht werden soll und entscheide dann.
Xam
User
Beiträge: 4
Registriert: Dienstag 10. Oktober 2023, 00:43

__blackjack__ hat geschrieben: Donnerstag 12. Oktober 2023, 01:07 @Xam: Als Verständnisfrage: Du hast eigentlich JSON Lines-Dateien und keine ”normalen” JSON-Dateien‽
Gute Frage: Die Dateien tragen nach dem Entpacken die Endung .json (davor sind es .zst Rar Dateien), werden aber von meiner Editing Software als "Textdatei" behandelt. (der Quelltext wird nicht eingefärbt sondern bleibt schwarzweiss), wobei das nat. auch mit der Länge der Dateien zusammenhängen könnte und sich auch nach Speichern unter neuem Namen nicht ändert. Codierung ist UTF-8.
Habs mal eben mit convertjson getestet, dort konnte ich tatsächlich den Quelltext von jsonl in json umwandeln, der Unterschied ist jedoch nur eine [ ] ganz am Anfang + Ende sowie ein "," nach jeder Zeile.

Häufigkeit der Pakete kann variieren, aber es werden wohl einige wenige neue Files pro Tag, die in eine DB neu importiert werden müssen. Was die Art der Abfrage und Herkunft etc. angeht muss ich erfragen / kann ich jetzt aus dem Stehgreif nicht genau sagen. Aber es dürften gewöhnliche Standardabfragen sein (so wie oben beschrieben?), also nichts besonders Spezielles oder Kryptisches.
Antworten