2015-03-12 4 views
0

Я выполняю запрос в таблице, где я получаю столбец со стомиллинами строк назад, потому что я хочу построить их в гистограмме. Проблема заключается в том, что до того, как программа завершится с кодом выхода -9, до того, как cur.fetchall() будет завершен, почти вся моя память (7,8 ГБ) и вся моя память подкачки (8 гб) будет завершена.Pythons fetchall ест всю мою своп-память

Как я могу предотвратить это? Должен ли я сначала отсортировать мой столбец, а затем сделать несколько запросов на нем, или может быть, лучший способ получить данные в моем запросе? Сам cur.execute почти не требует времени.

#!/usr/bin/python 

import sqlite3 as lite 
import numpy as np 
import sys 
import os 
import matplotlib.pyplot as plt 


def getQuantity(databasepath): 
    con = lite.connect(databasepath) 
    binwidth = 1 
    start = time.time() 
    with con: 
     cur = con.cursor() 
     cur.execute('SELECT latitude FROM MessageType1') 
     con.commit() 
     latitudes = cur.fetchall() #Breakdown here 
     latitudes = [x[0] for x in latitudes] 
     plt.hist(latitudes, bins=range(int(min(latitudes)), int(max(latitudes)) + binwidth, binwidth)) 
     plt.title("Bucket size: " + str(binwidth)) 
     plt.ylabel("Number of message") 
     plt.savefig('latlongstats'+'t'+str(time.strftime("%H:%M:%S")), format='png') 

if __name__ == "__main__": 

    getQuantity('database/database.db') 
+1

Попробуйте использовать выражение генератора 'latitudes = (x [0] для x в широтах)' –

+0

Извините, я должен был указать, код выхода и ошибка возникают до того, как cur.fetchall имеет возможность закончить. – bjornasm

+1

Не знаете, что вы можете сделать тогда, построение - это чересчур много памяти, поэтому факт, что у вас так много данных, вероятно, означает, что вам просто не хватает бара. –

ответ

0

Я обнаружил, что если я заменил следующее:

latitudes = cur.fetchall() 
    print "fetched" 
    latitudes = [x[0] for x in latitudes] 

с:

while True: 
     tmp = cur.fetchone() 
     if tmp != None: 
      latitudes.append(tmp[0]) 
     else: 
      break 

я получил тот же результат, Allthough она принимает навсегда, и только почти съедает мой баран (но не мой обмен).

 Смежные вопросы

  • Нет связанных вопросов^_^