| 

.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?
News:
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!