【问题标题】:Pythons fetchall eats all my swap memoryPython fetchall 吃掉了我所有的交换内存
【发布时间】:2015-03-12 16:05:28
【问题描述】:

我正在对一个表执行查询,在该表中我得到一列包含数亿行的列,这是因为我想将它们绘制在直方图中。问题是,在程序以退出代码 -9 退出之前,这几乎耗尽了我所有的内存 (7.8 gb) 和我所有的交换内存 (8gb),然后 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')

【问题讨论】:

  • 尝试使用生成器表达式latitudes = (x[0] for x in latitudes)
  • 对不起,我应该指定的,退出代码和错误出现在 cur.fetchall 有机会完成之前。
  • 不知道你能做什么,绘图也有点占用内存,所以你有这么多数据可能意味着你没有足够的内存
  • 感谢您的回答。我当然需要一些更好的硬件来进行这种分析,但是如果您在下面看到我的答案,我确实找到了一种可以应对的方法。
  • 如果将它与生成器结合使用,可能会提高性能

标签: python sqlite cursor fetchall


【解决方案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

我得到了相同的结果,尽管它需要很长时间,并且几乎耗尽了我的内存(但不是我的交换)。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多