| 

.NET C# Java Javascript Exception

2
ich nutzte psycopg2 in python!

ich habe eine select abfrage die eine große datenmenge aus einer postgres db abfragt.

cursor.execute("SELECT * FROM tableA;")
res = cursorProductDB.fetchall()


hierbei bekomme ich einen MemoryError!

dann habe ich versucht den freigegebenen speicher festzulegen
work_mem = 2048
cursor.execute('SET work_mem TO %s', (work_mem,))


leider hat das überhaupt nichts bewirkt!

jetzt wollte ich versuchen die daten in mehreren paketen auszulesen
i = 0
while(i<= 1500000):
cursor.execute("SELECT * FROM tableA LIMIT 10000, (10000*i);")
res = cursor.fetchall()
i += 1


hierbei ist aber wohl die syntax falsch! (10000*i) soll hierbei immer die start zeile erhöhen

welcher ansatz ist hier der beste (von der performance her)? und wie muss die query im letzten beispiel aussehen damit sie funktioniert?
23.06.2011
burner007 810 1 2 9
burner007 810 1 2 9
3 Antworten
0
Hallo,

bei deiner letzten Variante kannst du das Limit + Offset verwenden.
Guck mal hier: Queries - Limit and Offset

Aber was machst du denn mit den ganzen Datensätzen.. Da müllst du deinen RAM ganz schön zu...

Gruß
Michael
23.06.2011
michlG 1,7k 1 5
michlG 1,7k 1 5
0
ich wollte das problem nun mit limit und offset lösen!

i = 0
while (i <= 1000):
cur.execute("SELECT * FROM tableA ORDER BY id LIMIT 100 OFFSET 100*(%s)", (i))
res = cur.fetchall()
print len(res)
i += 1


bekomme aber folgende fehlermeldung:
TypeError: 'int' object does not support indexing

ist die schreibweise falsch?
05.07.2011
burner007 810 1 2 9
0
habs hinbekommen!!

lösung:
while (i <= 1000):         
cur.execute("SELECT * FROM tableA ORDER BY id LIMIT 100 OFFSET %s" % str(100*i))
res = cur.fetchall()
if(len(res) == 0): break
i += 1
05.07.2011
burner007 810 1 2 9
burner007 810 1 2 9

Stelle deine Python-Frage jetzt!