Python cx-oracle中的并行执行

Python cx-oracle中的并行执行,python,cx-oracle,Python,Cx Oracle,我最近加入了一家新公司,对python是一种新的脚本语言,并且一直在与cx_oracle合作创建一些ETL流程。到目前为止,我构建的脚本都是单线程作业,它们从Oracle源数据库中选择我需要的列子集,并将输出写入命名管道,外部进程正在该管道中等待读取该数据并将其插入目标 在我找到一些在5亿到20亿行范围内的表之前,这一切都很好。这项工作仍然有效,但需要很多小时才能完成。这些大型源表是分区的,所以我一直在尝试研究协调不同分区的并行读取的方法,这样我就可以让两个或多个线程同时工作,每个线程都写入一个

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

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

cx oracle中是否有一种优雅的方法来处理从同一表的不同分区读取的多个线程

以下是我当前的简单代码:

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个分区,因此硬编码分区名称不是首选选项。我一直在考虑设置分区名称数组并对其进行迭代,但如果大家有其他想法,我很乐意听听。

首先,您需要确保*cx\U Oracle*是线程安全的。由于它实现了,所以只需检查threadsafety模块全局。 值2或3表示可以打开到数据库的多个连接并同时运行多个查询。最好的方法是使用这个模块,它非常容易使用。这是一篇关于如何开始使用它的简短而甜蜜的文章


当然,不能保证通过管道传输查询将显著提高数据库引擎、I/O等性能,但这绝对值得一试。祝你好运

谢谢你。我知道cx_Oracle的线程安全性为2。这是可以做到的。。。在一个相关的问题中,有几个选项可以在python中并行执行任务。我的问题涉及到I/O繁重的任务,这些任务不需要在它们之间来回传递数据。线程化、多进程、子进程或其他方式最合适吗?