Питон Фетчалл съедает всю мою память подкачки

Я выполняю запрос к таблице, где я получаю столбец с несколькими сотнями миллионов строк назад, потому что я хочу отобразить их в гистограмме. Проблема в том, что это израсходует почти всю мою память (7,8 ГБ) и всю мою память подкачки (8 ГБ) до выхода из программы с кодом выхода -9, прежде чем cur.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 = 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

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

Другие вопросы по тегам