我使用下面的示例脚本使用cx_oracle从oracle数据库中提取大数据:
from cx_Oracle import connect
TABLEDATA = []
con = connect("user/password@host")
curs = con.cursor()
curs.execute("select * from TABLE where rownum < 100000")
for row in curs:
TABLEDATA.append([str(col) for col in list(row)])
curs.close()
con.close()
存储在列表中的问题是它最终会导致大约800-900 mb的RAM使用。 我知道我可以将其保存在文件中,而不是存储在列表中,但我使用此列表使用QTABLEVIEW和QABSTRACTTABLE MODEL显示表。
是否有任何备用或更有效的方法可以最大限度地减少存储此数据的内存使用量,并使用它来显示我的表格?
答案 0 :(得分:1)
我尝试了多个possobilities,我认为qsqltablemodel不适合我。虽然它直接从数据库加载数据,但随着你继续向下滚动它会在表中加载越来越多的数据,因此内存使用量不断增加。
我认为最理想的工作是能够在模型中加载设定的行数。向下滚动时,它会加载新行,但同时也会卸载已存在的行。所以在任何时候我们只在模型中加载了设置的行数。
答案 1 :(得分:0)
如果您不想将所有数据存储在RAM中,那么您需要为tableview使用一个模型,根据需要从数据库中获取信息。幸运的是,Qt本身支持这一点,并且可以连接到oracle数据库。
您需要查看:
请注意,这是c ++文档,但转换为PyQt相当容易(我总是使用c ++文档,尽管从未在c ++中编写代码)。您可能还希望将QSqlTableModel
子类化为标准接口提供稍微不同的行为!