Hi,
ist es ein Problem, wenn man eine Datei, z.B. ein JSON-File sehr häufig bzw. hochfrequent öffnet, beschreibt und wieder schließt?
Hintergrund: Ich habe eine Methode "write" , mit der ein file mit "with open" geöffnet wird und anschließend etwas geschrieben wird. Geschlossen wird die Datei ja wieder von selbst.
Wenn ich jetzt diese Methode "write" sehr häufig Rufe (kommt in der Initialisierungsphase vor), dann wird sehr häufig auf mein JSON-File zugegriffen. Könnte das ein Problem darstellen? Oder wird mein Skript nur langsamer, weil darauf gewartet wird, dass das File geschlossen wurde?
Schreiben in Files
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@helloBavaria Das sollte technisch kein Problem sein. Und was die Geschwindigkeit angeht, da ist der übliche Rat einfach nachzumessen wo der (gefühlte) Flaschenhals tatsächlich liegt, bevor man anfängt etwas zu optimieren.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
-
- User
- Beiträge: 12
- Registriert: Donnerstag 17. Februar 2022, 11:32
Vielen Dank für die Antwort.
Wie läuft das eigentlich ab? Wartet der Pythonprozess jedes mal bis die Datei geöffnet, beschrieben und geschlossen wurde und dann erfolgt der Rücksprung zur aufrufenden Methode oder läuft das irgendwie asynchron?
Wie läuft das eigentlich ab? Wartet der Pythonprozess jedes mal bis die Datei geöffnet, beschrieben und geschlossen wurde und dann erfolgt der Rücksprung zur aufrufenden Methode oder läuft das irgendwie asynchron?
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@helloBavaria: Einerseits wartet der Prozess öffnen, beschreiben, und schliessen ab, anderseits heisst das bei aktuellen Betriebssystemen nicht, dass da tatsächlich die Daten auch nach dem Schliessen komplett auf dem Datenträger sein müssen. Ausser wenn es das doch bedeutet. Das hängt von verschiedenen Faktoren ab. Üblicherweise geht das alles über einen Cache. Kann es natürlich nur wenn der Arbeitsspeicher nicht komplett voll ist. Und manchmal werden Datenträger auch so eingebunden, dass alles sofort geschrieben wird. Zum Beispiel bei Wechselmedien, wo die Gefahr besteht, dass der Benutzer die jederzeit am System vorbei abzieht oder auswirft.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
@helloBavaria: das Szenario hört sich seltsam an. Das Initalisieren einer Datenstruktur und das Schreiben eben jener in eine Datei sind zwei verschiedene Dinge. Wenn Du also erst alles initialisierst und dann einmal schreibst, dann hast Du das Problem erst gar nicht.
Wie Sirius3 schon gesagt hat, klingt komisch, schon vom Design her, während der Initialisierungsphase (von was eigentlich) sollte nichts persistiert werden.
Willst du uns erklären, warum du während der Initialisierungsphase, viel Schrieben musst, vielleicht finden wir ja eine Alternative.
Wenn es wirklich sinnvoll ist viel zu Schreiben, könnte das Proxy Pattern eine alternative sein. Das würde die Schreibzugriffe sammeln.
Wäre aber mit ein Redesign verbunden und im Augenblick ist alles nur Spekulation.
Willst du uns erklären, warum du während der Initialisierungsphase, viel Schrieben musst, vielleicht finden wir ja eine Alternative.
Wenn es wirklich sinnvoll ist viel zu Schreiben, könnte das Proxy Pattern eine alternative sein. Das würde die Schreibzugriffe sammeln.
Wäre aber mit ein Redesign verbunden und im Augenblick ist alles nur Spekulation.
- DeaD_EyE
- User
- Beiträge: 1205
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Da macht man sich erst Gedanken drüber, wenn das Öffnen der Datei zu lange dauert oder wenn man das z.B. eine Million mal hintereinander macht.
Ggf. kannst du die Datei offen lassen und das Objekt den Funktionen übergeben, die dann schreiben. Die letzte Funktion sollte die Datei dann schließen.
Oder du sammelst zuerst die Daten, die geschrieben werden sollen und erst wenn alles komplett ist, dann einmal schreiben.
Ggf. kannst du die Datei offen lassen und das Objekt den Funktionen übergeben, die dann schreiben. Die letzte Funktion sollte die Datei dann schließen.
Oder du sammelst zuerst die Daten, die geschrieben werden sollen und erst wenn alles komplett ist, dann einmal schreiben.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
-
- User
- Beiträge: 12
- Registriert: Donnerstag 17. Februar 2022, 11:32
Also im Grund ist das ein recht großer, komplexer Prozess. Beim initialisieren werden gewisse Dinge aus Dateien gelesen (die können sich anderweitig geändert haben), anschließend in Python aufbereitet und dann letztendlich "nacheinander" über die "write" Methode wieder in eine andere Datei geschrieben, welche später, u.a. auch von anderen Prozessen wieder gebraucht wird. Das alles wird über die INIT-Methode angetriggert. Diese Methode "write" wird später auch für andere, einzelne Schreibvorgänge genützt, weshalb hier auch nichts gebuffert wird o.ä. sondern immer gleich geschrieben wird. Der Python-Code stammt nicht von mir, ich darf ihn nur betreuen, deshalb bin ich auch noch nicht so tief drin.
Es sind bisher keine Problem etc. aufgetreten. Bei der Suche nach einem anderen Fehler ist nur aufgefallen, dass die "write" Methode in der Initialisierungsphase extrem oft gerufen wird. Und bei jedem Aufruf gibt es eben diesen Dateizugriff. Da kam dann die Frage auf, ob das vielleicht kritisch sein könnte.
Wenn es aber so ist, dass das technisch kein Problem ist, sondern dann am Anfang nur etwas Zeit kostet (auf Datei öffnen, schreiben, schließen muss der Prozess jedesmal warten), dann ist es kein Problem. Hier ist nichts zeitkritisches dabei.
Es sind bisher keine Problem etc. aufgetreten. Bei der Suche nach einem anderen Fehler ist nur aufgefallen, dass die "write" Methode in der Initialisierungsphase extrem oft gerufen wird. Und bei jedem Aufruf gibt es eben diesen Dateizugriff. Da kam dann die Frage auf, ob das vielleicht kritisch sein könnte.
Wenn es aber so ist, dass das technisch kein Problem ist, sondern dann am Anfang nur etwas Zeit kostet (auf Datei öffnen, schreiben, schließen muss der Prozess jedesmal warten), dann ist es kein Problem. Hier ist nichts zeitkritisches dabei.
Herzlichen Glückwunsch, du hast ein Design Problem geerbt.
Es klingt, als hätte der Autor der Klasse die __init__ missbraucht, um da zu viel zu machen. In einer guten Software Design sollte die __init__ nur die minimalen schritte machen welche nötig sind das Objekt zu initialisieren. Idealerweise hast du nach dem Aufrufen ein Objekt oder eine Exception, wenn das Objekt nicht erzeugt werden kann.
Das Aufbereiten der Daten könnte schon zu viel sein in der __init__, aber das hängt vom Einzelfall ab und lässt sich so pauschal nicht sagen.
Das Schreiben der Daten in eine andere Datei hat in einer Initialisierung definitiv nichts zu suchen und sollte in eine Methode ausgelagert werden. Ich kann dir nur Empfehlen ein Redesign einzuplanen. Wenn das Programm so ein Codesmell hat, liegen da erfahrungsgemäß noch andere Dinge im Argen.
Von daher schön, dass du noch keine Probleme hast, das nimmt erstmal etwas Druck vom Kessel und gibt dir die Chance, das in Ruhe zu planen. Vielleicht willst du dabei auch das Design der Klasse mit der Write Funktion so ändern, dass sie alles auf einmal schreiben kann.
Es klingt, als hätte der Autor der Klasse die __init__ missbraucht, um da zu viel zu machen. In einer guten Software Design sollte die __init__ nur die minimalen schritte machen welche nötig sind das Objekt zu initialisieren. Idealerweise hast du nach dem Aufrufen ein Objekt oder eine Exception, wenn das Objekt nicht erzeugt werden kann.
Das Aufbereiten der Daten könnte schon zu viel sein in der __init__, aber das hängt vom Einzelfall ab und lässt sich so pauschal nicht sagen.
Das Schreiben der Daten in eine andere Datei hat in einer Initialisierung definitiv nichts zu suchen und sollte in eine Methode ausgelagert werden. Ich kann dir nur Empfehlen ein Redesign einzuplanen. Wenn das Programm so ein Codesmell hat, liegen da erfahrungsgemäß noch andere Dinge im Argen.
Von daher schön, dass du noch keine Probleme hast, das nimmt erstmal etwas Druck vom Kessel und gibt dir die Chance, das in Ruhe zu planen. Vielleicht willst du dabei auch das Design der Klasse mit der Write Funktion so ändern, dass sie alles auf einmal schreiben kann.