用Python从Oracle获取海量数据
我需要在Python2.6中从Oracle(使用cx_Oracle)获取大量数据,并生成一些csv文件 数据大小约为400k记录x 200列x 100个字符 哪种方法最好 现在,使用以下代码用Python从Oracle获取海量数据,python,oracle,file,cx-oracle,Python,Oracle,File,Cx Oracle,我需要在Python2.6中从Oracle(使用cx_Oracle)获取大量数据,并生成一些csv文件 数据大小约为400k记录x 200列x 100个字符 哪种方法最好 现在,使用以下代码 ctemp = connection.cursor() ctemp.execute(sql) ctemp.arraysize = 256 for row in ctemp: file.write(row[1]) ... 。。。脚本在循环中保留数小时,没有任何内容写入文件。。。(是否有方法为每个提取
ctemp = connection.cursor()
ctemp.execute(sql)
ctemp.arraysize = 256
for row in ctemp:
file.write(row[1])
...
。。。脚本在循环中保留数小时,没有任何内容写入文件。。。(是否有方法为每个提取的记录打印消息?)
注意:我对Oracle没有任何问题,在SqlDeveloper中运行查询速度非常快
谢谢你,吉安
我认为您的代码在一次一行地向数据库请求数据,这可能解释了速度缓慢的原因 尝试:
您应该改用
cur.fetchmany()
。
它将获取由ArraySe(256)定义的行块
Python代码:
def chunks(cur): # 256
global log, d
while True:
#log.info('Chunk size %s' % cur.arraysize, extra=d)
rows=cur.fetchmany()
if not rows: break;
yield rows
然后在for循环中进行处理
for i, chunk in enumerate(chunks(cur)):
for row in chunk:
#Process you rows here
这正是我在中所做的。“是否有打印消息的方法”…是的,在代码中添加打印语句…您的代码中是否有
文件.flush()
或类似文件?您听说过吗?比使用print
先将800兆字节提取到内存,然后写入文件要好得多?可以,但我不想。
for i, chunk in enumerate(chunks(cur)):
for row in chunk:
#Process you rows here