我正在尝试从oracle数据库读取数据。我必须在python上阅读返回100万行的简单选择的结果。
我使用fetchall()
函数,更改了游标的arraysize属性。
select_qry = db_functions.read_sql_file('src/data/scripts/03_perimetro_select.sql')
dsn_tns = cx_Oracle.makedsn(ip, port, sid)
con = cx_Oracle.connect(user, pwd, dsn_tns)
start = time.time()
cur = con.cursor()
cur.arraysize = 1000
cur.execute('select * from bigtable where rownum < 10000')
res = cur.fetchall()
# print res # uncomment to display the query results
elapsed = (time.time() - start)
print(elapsed, " seconds")
cur.close()
con.close()
如果我删除where条件where rownum < 10000
,则python环境将冻结,并且fetchall()
函数将永远不会结束。
经过一些试验,我发现了此精确选择的极限,它可以工作到50k行,但是如果我选择60k行,它将失败。
是什么引起了这个问题?我是否必须找到另一种方式来获取此数量的数据,或者问题是ODBC连接?如何测试?
我正在尝试从oracle数据库读取数据。我必须在python上阅读返回100万行的简单选择的结果。我使用fetchall()函数,更改了...
考虑使用Oracle的ROWNUM
批量运行。要合并回单个对象,请追加到不断增加的列表中。下面假设表的总行数为1磨。根据需要进行调整:
您可能正在运行cx_Oracle的计算机上的内存不足。不要使用fetchall()
,因为这将要求cx_Oracle将所有结果保存在内存中。使用类似这样的方法来获取批记录: