Developer92
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Hallo, ich habe (wieder mal) ein kleines Programmierproblem. Aktuell hab ich etwa 400 Datensätze in einer SQLite-Datenbank gespeichert. Jetzt ist es so, dass jede Datenbank mit einem Algorithmus abgearbeitet werden muss, was leider pro Datensatz immer ein paar Minuten dauert. Ich habe mir also gedacht, dass man immer hundert Datensätze in einen Thread packt (Sprich dass ich mit 4 Threads die 400 Datensätze abarbeiten lasse). Nun die Frage: Kann ich die Gesamtzahl der Datensätze abfragen und dann pro Thread sagen, er soll die Datensätze 101 bis 200 abarbeiten? Ich weiß man könnte die 400 Datensätze locker in eine Liste laden, diese dann aufteilen und jedem Thread ein Stückchen davon übergeben, aber das Problem ist, dass die Zieldatenbank später mehrere Millionen Einträge hat, was die ganze Sache zwecks Arbeitsspeichermangels etwas verkompliziert. Hoffe jemand versteht das Problem und weiß was ich bräuchte. mfg
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Kann SQLite limit ? Wenn ja, sollte das das einfachste sein, da Du damit DB seitig die Datensatzsequenz definieren kannst.
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Lysander schrieb: Kann SQLite limit ?
Ah, danke. Das war der Befehl, den ich gesucht habe 👍 Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen. mfg
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
TDeveloper schrieb: Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen.
Ich würde fetchone() nehmen und nur über den PK zählen. Ansonsten geht das, ja ☺
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Lysander schrieb: TDeveloper schrieb: Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen.
Ich würde fetchone() nehmen und nur über den PK zählen. Ansonsten geht das, ja ☺
Was meinst du mit PK?
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
TDeveloper schrieb: Was meinst du mit PK?
Primary Key - also den Primärschlüssel.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
Je nach Aufgabe kann man auch - sofern man einen fortlaufenden Index hat, sukzessive Teile abarbeiten, in dem man mit dem Modulo arbeitet: | ... WHERE pk%20 = 0 AND ...
|
dann
| ... WHERE pk%20 = 1 AND ...
|
dann 2, 3, ... 19. Man würde so jeweils 1/20tel der Datensätze abarbeiten.
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat. mfg
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
TDeveloper schrieb: Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat.
Funzen den Tabellen ohne PK? *wunder* Sollte eigentlich ja gar nicht gehen... Und user unknwowns Vorschlag hat mit meinem nix zu tun!
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Lysander schrieb: TDeveloper schrieb: Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat.
Funzen den Tabellen ohne PK? *wunder* Sollte eigentlich ja gar nicht gehen...
Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺ Funktioniert wunderbar 😀
Und user unknwowns Vorschlag hat mit meinem nix zu tun!
Ah, OK mfg
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
TDeveloper schrieb: Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺
Weil das das relationale Konzept ad absurdum führt! Selbst wenn es technisch geht, solltest Du Dein DB-Design überdenken!
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Lysander schrieb: TDeveloper schrieb: Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺
Weil das das relationale Konzept ad absurdum führt! Selbst wenn es technisch geht, solltest Du Dein DB-Design überdenken!
Ah, man merkt halt doch, dass ich mich noch nicht so lange mit DB's beschäftige. Hab eben den Code überarbeitet, jetzt gibts nen Primary Key ☺ Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮 mfg
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
TDeveloper schrieb: Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮
Kapiere ich nicht! Gib mal nen Beispiel.
|
Developer92
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Lysander schrieb: TDeveloper schrieb: Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮
Kapiere ich nicht! Gib mal nen Beispiel.
Ist doch ganz einfach. Folgendes Beispiel: | import sqlite3
connection = sqlite3.connect('datenbank.db')
cursor = connection.cursor()
cursor.execute('CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT, wert INTEGER)')
for x in range(0,100):
cursor.execute('INSERT INTO test VALUES(?, ?)', (None, x,))
connection.commit()
# Bisher ging alles. Jetzt kommts:
cursor.execute('INSERT INTO test VALUES(?, ?)', (10, 10,)) # Dann erscheint folgender Hinweis: "sqlite3.IntegrityError: PRIMARY KEY must be unique"
|
Wenn ich jetzt aber den SQLite Datenbank Browser öffne (hab ich ausm Software-Center installiert, ist recht praktisch zum angucken von Datenbanken 😉 ) kann ich ohne Probleme einen "Record" erzeugen, der die gleiche ID wie ein bereits vorhandener Datensatz hat. Ich hab zum Beweis mal ein Foto angehängt. mfg
- Bilder
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Wie es aussieht ist das ein Fehler im SQLite Manager! Bist Du Dir sicher, dass dort die DB auch entsprechend aktuell ist? Evtl. ist dort die Tabelle anders definiert? An Deiner Stelle solltest Du Dir mal etwas über Keys durchlesen - letztlich ist das die Grundlage für relationale Datenbanken.
|