2017-12-13 11 views
1

psycopg을 사용하여 데이터베이스에 연결하는 python에 스크립트를 작성했습니다. 동일한 데이터베이스에서 두 테이블을 사용하고 있습니다. 먼저 select * from table_1을 실행 한 후 각 행 (fetchone)이 몇 가지 요구 사항을 충족하는지 확인합니다. 그럴 경우 테이블 2의 새 행이 INSERT으로 생성됩니다. 코드는 다음과 유사합니다psycopg2에서 커서 안에 스레딩

cursor_1 = conn.cursor() 
cursor_2 = conn.cursor() 

cursor_1.execute("SELECT * FROM table_1") 
for i in range(1,n): 
    a = cursor_1.fetchone() 
    if (condition_in_a): 
     cursor_2.execute("INSERT into table_2 (f1,f2) values (v1,v2)") 

스크립트는 순차적 for 루프에서 실행하고 나는 성능면에서 psycopg2.pool을 통해이 작업을 수행 할 수있는 더 좋은 방법이 있는지 알고 싶어. 그래서 내 질문은 : psycopg 커서를 멀티 스레드 가능합니까? 그렇지 않은 경우 성능을 향상시키는 데 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

답변

1

단일 스레드 방식에서는 메모리 사용량과 행 처리 속도 간의 균형을 유지하려고합니다. fetchone은 메모리 사용량을 줄이지 만 데이터를 가져 오기 위해서는 더 많은 작업이 필요합니다. 거대한 데이터 세트의 경우 fetchall은 많은 양의 메모리를 사용하며 데이터로드는 처리가 시작되기까지 어느 정도 시간이 걸릴 수 있습니다.

적어도 더 좋은 방법은 fetchmany으로 작은 부분으로 데이터를 가져 오는 것입니다. 정말 성능에 대한 확실하지 않다

당신은뿐만 아니라 처리 멀티 스레딩 구현할 수있는이 방법을 바탕으로
def ResultIter(cursor, limit=100): 
    while True: 
     results = cursor.fetchmany(limit) 
     if not results: 
      break 
     for result in results: 
      yield result 

하지만 다음 생성기는 과정을 단순화 할 수있다.