| 

.NET C# Java Javascript Exception

4
Hallo zusammen,
ich habe ein Problem mit Python Threading und sqlite. Ich versuche eine aufwendige Datenbank Operation in verschiednene Threads auszuführen. (sqlite ist ja nicht besonderst flott)
Mein erster Versuch, das Datenbank Objekt in den Thread übergeben. Was einen Fehler warf.
Mein zweiter Versuch, das Datenbank Objekt im Thread erzeugen und nach Ablauf wieder zerstören. Was den selben Fehler warf.

Fehler:
Exception sqlite3.ProgrammingError: 'SQLite objects created in a Thread can only be used in the same thread.

Ist es überhaupt möglich, Threading auf der selben sqlite Datenbank zu betreiben?

Gruß Jens
News:
13.09.2011
Gast
41 2
3 Antworten
1
Nach den Aussagen auf sqlite.org sollte das möglich sein. Weitere Recherchen führen zu stackoverflow.com, wo diese Frage schon ausführlich behandelt wurde. Neben Alternativvorschlägen liest man auch immer wieder das hier:
contrary to popular belief, newer versions of sqlite3 do support access from multiple threads.
this can be enabled via optional keyword argument check_same_thread
e.g
sqlite.connect(":memory:", check_same_thread = False)

Ansonsten prüf mal, welche Version du verwendest.
Wenn Du präzisierst, was Dir nicht schnell genug geht und in welchem Kontext Du optimieren möchtest, helfe ich gerne nochmal. Ich bin mir nämlich nicht ganz sicher, ob Du Dein Ziel mit der angedachten Lösung erreichst.

Viel Erfolg
Florian
14.09.2011
ffordermaier 8,4k 3 9
0
Hallo Florian,
also ich verwende Python 2.7.

Aufgabenstellung ist eine Hörbuchverwaltung (ich weiß gibt es schon).
Darin gibt es 7 Tabellen
mappingArtis, mappingAlbumArtist, mappingAutor (artistId int, fileListId int)
artist ( id int, name varchar(255) )
gerne ( id int, name varchar(255) )
hoerbuch (id int, name varchar (255), publish year, isHeard default NULL, lastchange timestamp)
fileList (id int, name varchar(255), comment text, lenght float)

Es sollen aus den Hörbüchern die MP3 Tags ausgelesen und in die Datenbank importiert werden. Zur Zeit gibt es ca. 11.000 einzelne Files. Das auslesen der MP3 Tags läuft schon recht zügig (ca. 2 Minuten)
Es kann für Artist, AlbumArtist und Autor X Personen in den MP3 Tag eingetragen sein. Daher sind die Mapping Tabellen vorhanden.
Im verlauft gehe ich wie folgt vor:
- Prüfung des Genre. Ist es noch nicht vorhanden, wird es in die Datenbank eingetragen, ansonsten wird die vorhanden ID geladen. Hierfür habe ich mir einen Datenstore geschrieben um nicht ständig auf die Datenbank zugreifen zu müssen. Also halte ich mir das im Ram vor.
- Prüfung der verschiedenen Artist/AlbumArtist/Autor. Auch hier mit Datenstore im Ram.
- Prüfung des Hörbuches mit evtl. Update oder Insert.
- Prüfung der einzelnen Files mit evtl. Update und Insert. (Eigenlich müsste hier auch ein Delete auf der Datenbank gemacht werden, um nicht mehr vorhandene Files zu löschen. Das habe ich mir bisher gespart)
- Aufbau der verschiedenen Artist/AlbumArtist/Autor Mappings. Hier werden alle vorhanden Datensätze gelöscht um keine Altlasten zu haben. Ich überlege mir, das aber im Ram zu machen, um die Last auf der DB zu reduzieren.

Alles in allem hab ich dann eine Laufzeit von 45 Minuten. Könnte ich mit leben, da der Import nicht immer über alle Files sondern zukünftig nur noch über neue laufen soll. Aber mein Ego wollte es kürzer haben und da bin ich auf die Idee mit dem paralellen verarbeiten der Daten gekommen.

Hast du hierzu noch eine Idee oder Tipps?

Gruß Jens
16.09.2011
XJenso 332 7
Sorry for being late.
Das hört sich vom Mengengerüst für mich nicht so an, als dass das 45min dauern kann. Mehrere Threads sehe ich da erstmal nicht als Lösung. Wie steht es den mit Indizes auf den Tabellen? Machst Du einzelen Inserts oder verpackst Du das in Transaktionen? Wenn Du 1000 INSERTs in eine Transaktion packst und ausführst geht das ne ganze Ecke schneller, als 1000 einzelne. Mit indizes auf der Tabelle muss die arme DB mit jedem Aufruf noch zusätzlich arbeiten. Vielleicht helfen Dir diese Anregungen dabei, Deine bisherige Implementierung dahingehend zu reflektieren.
ffordermaier 21.09.2011
no Prob
war auch ziemlich beschäftigt. Ich habe das ganze mit Transaktion umgesetzt. Passt auch von der Zeit her.
Ausserdem ist der Import der Dateien keine Dauerthema. Es wird nur einmalig importiert.
Danke für deine Hilfe.

Gruß Jens
XJenso 23.12.2011
0
Ich würde die Frage als gelöst markieren, leider hab ich die Frage damals im nicht eingeloggten Zustand gepostet. Jetzt komme ich nicht mehr daran. Von daher diese Antwort hier.
Mir haben die Hilfen entsprechend geholfen.

Jens
23.12.2011
XJenso 332 7

Stelle deine Python-Frage jetzt!