首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cx-oracle中的并行执行

cx-oracle中的并行执行
EN

Stack Overflow用户
提问于 2011-09-23 22:09:52
回答 1查看 4.1K关注 0票数 2

我最近加入了一家新公司,是python (他们首选的脚本语言)的新手,一直在使用cx_oracle创建一些ETL流程。到目前为止,我构建的脚本都是单线程作业,它们从Oracle源数据库中选择我需要的列的子集,并将输出写入命名管道,外部进程正在等待读取该数据并将其插入到目标中。

在我看到一些行范围在5亿到20亿行的表之前,这种方法一直运行得很好。这项工作仍然有效,但需要几个小时才能完成。这些大型源表是分区的,所以我一直在尝试研究协调不同分区的并行读取的方法,这样我就可以让两个或更多线程并发工作,每个线程都写入单独的命名管道。

在cx-oracle中有没有一种优雅的方式来处理从同一个表的不同分区读取的多个线程?

下面是我当前的(简单)代码:

代码语言:javascript
复制
import cx_Oracle
import csv

# connect via SQL*Net string or by each segment in a separate argument
connection = cx_Oracle.connect("user/password@TNS")


csv.register_dialect('pipe_delimited', escapechar='\\' delimiter='|',quoting=csv.QUOTE_NONE)

cursor = connection.cursor()
f = open("<path_to_named_pipe>", "w")

writer = csv.writer(f, dialect='pipe_delimited', lineterminator="\n")
r = cursor.execute("""SELECT <column_list> from <SOURCE_TABLE>""")
for row in cursor:
        writer.writerow(row)
f.close()

我的一些源表有超过1000个分区,因此在中硬编码分区名不是首选选项。我一直在考虑建立分区名称数组并遍历它们,但如果大家有其他想法,我很想听听他们的意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-23 23:43:29

首先,您需要确保*cx_Oracle*是线程安全的。因为它实现了全局,所以您需要做的就是检查threadsafety模块的全局。值23表示您可以打开到数据库的多个连接并同时运行多个查询。做到这一点的最好方法是使用threading模块,它非常容易使用。This是一篇简短而甜蜜的文章,介绍了如何开始使用它。

当然,不能保证流水线查询会带来显著的性能提升(DB引擎、I/O等原因),但这绝对值得一试。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7530319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档