Python Script hört einfach auf?


10.09.2023, 13:13
import os
import sqlite3

verzeichnis = "/Fotos"

verbindung = sqlite3.connect("test.db")
cursor = verbindung.cursor()

cursor.execute("CREATE TABLE IF NOT EXISTS dateien (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)")

for datei in os.listdir(verzeichnis):
  if os.path.isfile(os.path.join(verzeichnis, datei)):
    dateiname_ohne_endung = os.path.splitext(datei)[0]
    cursor.execute("INSERT INTO dateien (name) VALUES (?)", (dateiname_ohne_endung,))

verbindung.commit()
verbindung.close()

Habe den GB entfernt

jo135  10.09.2023, 12:39

Ohne zumindest relevante Ausschnitte aus dem Code kann man hier nur herumraten. Was meinst du mit dem Garbage Collector...?

FrageCoding 
Fragesteller
 10.09.2023, 12:50

Weißt du nicht was ein Garbage Collector ist?

jo135  10.09.2023, 12:53

Weißt du es denn? Der GC ist immer aktiv. Insofern ist es fraglich, was du mit "GC integriert" meinst. Als Anfänger solltest du damit gar nichts manuell tun.

FrageCoding 
Fragesteller
 10.09.2023, 12:57

Klar weiß ich es, aber wenn ich selber schon weiß das ich an einer stelle datein x,y nicht mehr brauch setzt man diesen fix an.

jo135  10.09.2023, 12:59

Du hast den Sinn eines GC offenbar missverstanden. Du kannst damit nicht explizit die "Dateien x,y" (was immer das heißt) loswerden. Weiter gilt: ohne Code keine sinnvolle Hilfe.

FrageCoding 
Fragesteller
 10.09.2023, 13:03

Dateien nicht, aber Daten klar. Bei einer Interpretierten Sprache, macht das durchaus Sinn. Und wenn du dir keine For-Schleife vorstellen kannst weiß ich auch nicht weiter.

jo135  10.09.2023, 13:09

Zur Erinnerung: Ich habe kein Problem mit meinem Code, du hast es. Wie soll jemand erraten, was du darin falsch gemacht hast, ohne ihn zu sehen?

FrageCoding 
Fragesteller
 10.09.2023, 13:14

Ich hab den Code ergänzt

4 Antworten

Es wurden Dir ja schon einige grundlegende Dinge gesagt, wie reglmässiges commit, aber wenn es wirklich viele Dateien sind, würde ich nicht listdir() nehmen, sondern scandir() oder gleich walk() falls es eine Verzeichnisstruktur ist.

Du kannst übrigens auch hingehen und z.B. nach jeweils 10 oder 20 Inserts ein commit ausführen.

P.S.: Oder Du benutzt executemany mit entsprechenden batches udn machst nach jedem executemany halt ein commit.

Du baust also eine sehr große Transaktion mit über 1000 INSERTs (und davor ggf. dem CREATE TABLE), bevor du endlich ein Commit machst. Das ist nicht unbedingt falsch, aber selten sinnvoll. Es wird sinnvoller sein, vorerst jedes INSERT separat zu committen (bzw. isolation_level auf None zu setzen, womit commit nicht nötig ist).

Der banale erste Schritt wäre auch zu prüfen, ob der Code ohne Datenbank funktioniert. D.h. kommen alle gewünschten Dateinamen raus?

FrageCoding 
Fragesteller
 10.09.2023, 15:14

Hab ich gemacht, dort wird ab/an der selben stelle Python beendet.

0
jo135  10.09.2023, 15:19
@FrageCoding

An welcher Stelle? In der Form, wie es da steht, gibt das Skript auch keinerlei Meldung, wenn es erfolgreich zu Ende läuft.

0
FrageCoding 
Fragesteller
 10.09.2023, 15:37
@jo135

Die Forschleife wird komplette beendet. Aber es haben halt datein gefehlt.

0

hast du RAM überwacht? Ich trau garbage collectoren nicht zu 100% 😅

evtl ein print vor jedem Bild laufen lassen um festzustellen bei welchem der Fehler passiert? Oder debugger anschmeissen aber das ist vermutlich aufwenidger

evtl mal Anfang die gesamt Zahl der Liste ausgeben, vlt. werden nicht alle gelesen..

Woher ich das weiß:Berufserfahrung – Softwareentwickler als Nebenjob
FrageCoding 
Fragesteller
 10.09.2023, 12:52

Am RAM kann es aber eigentlich nicht liegen hab 32GB frei XD

0
Ziegelstein43  10.09.2023, 13:01
@FrageCoding

Okay ja da müsstest wirklich ziemlichen Schmarren geschrieben haben dass es daran scheitert 😂

google mal für Python nach einem Paket für eine ProgressBar - dann steht beim laufen lassen der Fortschritt zumindest dabei. So könntest du sehen ob Python denkt dass er fertig wäre oder ob er einfach still und heimlich abstirbt

1

1. Schau mal nach was in der datenbank gespeichert wurde.

2. Könnte sein das der Cursor Buffer überlaufen ist. Mach nach dem create if ein commit und dann alle 50 inserts einen, am besten eigentlich nach jedem finde ich.

FrageCoding 
Fragesteller
 10.09.2023, 15:13

Hab jetzt nach jedem Insert ein Commit ist noch leider so.

0