2011-09-23 6 views
2

저는 최근에 새로운 회사에 가입했으며 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() 

. 파티션 이름의 배열을 설정하고 반복하는 방법을 생각해 보았습니다.하지만 사람들이 다른 아이디어를 듣고 싶다면 그것을 듣고 싶습니다.

+0

관련 질문에, 파이썬에서 작업을 병렬로 실행하기위한 몇 가지 옵션이 있습니다. 내 문제는 데이터를 앞뒤로주고받을 필요가없는 I/O가 많은 작업입니다. ** 스레드 **, ** 다중 프로세스 **, ** 하위 프로세스 ** 또는 다른 것이 가장 적절합니까? –

답변

1

우선 * cx_Oracle *이 스레드로부터 안전한지 확인해야합니다. Python DB API Spec v2.0을 구현 했으므로 threadsafety 모듈을 전역으로 확인하면됩니다. 값 2 또는 3은 DB에 대한 다중 연결을 열어 여러 쿼리를 동시에 실행할 수 있음을 의미합니다. 이를 수행하는 가장 좋은 방법은 매우 사용하기 쉬운 threading 모듈을 사용하는 것입니다. This은 시작하는 방법에 대한 짧고 달콤한 기사입니다.

물론 쿼리를 파이프 라이닝하면 성능이 크게 향상 될 수 있습니다 (DB 엔진, I/O 등의 이유).하지만 반드시 시도해 볼만한 가치가 있습니다. 행운을 빕니다!

+0

고마워요. 나는 cx_Oracle이 2의 threadsafety를 가지고 있음을 안다. 할 수있다. 단지 그것을 할 수있는 최선의 방법을 찾아야한다. –