用Python从Oracle获取海量数据

用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]) ... 。。。脚本在循环中保留数小时,没有任何内容写入文件。。。(是否有方法为每个提取

我需要在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])
  ...
。。。脚本在循环中保留数小时,没有任何内容写入文件。。。(是否有方法为每个提取的记录打印消息?)

注意:我对Oracle没有任何问题,在SqlDeveloper中运行查询速度非常快

谢谢你,吉安
  • 在每行后面添加打印语句
  • 在循环中添加一个计数器,指示每N行之后的进度
  • 查看类似“progressbar”的模块以显示进度指示器

  • 我认为您的代码在一次一行地向数据库请求数据,这可能解释了速度缓慢的原因

    尝试:


    您应该改用
    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