저는 최근에 새로운 회사에 가입했으며 python (기본 스크립팅 언어)에 익숙하지 않고 cx_oracle을 사용하여 일부 ETL 프로세스를 작성했습니다. 필자가 작성한 스크립트는 오라클 소스 DB에서 필요로하는 컬럼의 서브 세트를 선택하고 출력을 외부 프로세스가 해당 데이터를 읽고 대상에 삽입하기 위해 대기중인 Named Pipe에 출력을 쓰는 단일 스레드 작업이었습니다 .cx-oracle의 병렬 실행
5 억 2 천만 행 범위에있는 일부 테이블에 도달 할 때까지 정상적으로 작동합니다. 작업은 여전히 작동하지만 완료하는 데 많은 시간이 걸립니다. 이러한 대형 소스 테이블은 분할되어 있으므로 서로 다른 파티션의 병렬 읽기를 조정하는 방법을 연구하여 두 개 이상의 스레드가 동시에 작업 할 수 있도록하고 각 파이프는 별도의 명명 된 파이프에 기록합니다.
같은 테이블의 다른 파티션에서 읽는 다중 스레드를 처리하는 우아한 방법이 cx-oracle에 있습니까?
은 여기 내 전류 (간단한) 코드입니다 :
내 소스 테이블의 일부는 1000 파티션이 너무 선호하는 옵션을 선택하지 않습니다에 파티션 이름을 하드 코딩이import cx_Oracle
import csv
# connect via SQL*Net string or by each segment in a separate argument
connection = cx_Oracle.connect("user/[email protected]")
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()
. 파티션 이름의 배열을 설정하고 반복하는 방법을 생각해 보았습니다.하지만 사람들이 다른 아이디어를 듣고 싶다면 그것을 듣고 싶습니다.
관련 질문에, 파이썬에서 작업을 병렬로 실행하기위한 몇 가지 옵션이 있습니다. 내 문제는 데이터를 앞뒤로주고받을 필요가없는 I/O가 많은 작업입니다. ** 스레드 **, ** 다중 프로세스 **, ** 하위 프로세스 ** 또는 다른 것이 가장 적절합니까? –