저는 MySQLdb를 사용하여 MySQL 데이터베이스에 액세스하는 Python 프로그램을 개발 중입니다. 어떤 상황에서는 많은 행에서 INSERT 또는 REPLACE 명령을 실행해야합니다. 나는 현재 이렇게하고있다 :Python MySQLdb에서 executemany가 느린 이유는 무엇입니까?
db.execute("REPLACE INTO " + table + " (" + ",".join(cols) + ") VALUES" +
",".join(["(" + ",".join(["%s"] * len(cols)) + ")"] * len(data)),
[row[col] for row in data for col in cols])
괜찮 았지만 일종의 어색하다. 나는 그것을 더 쉽게 읽을 수 있는지 궁금해서 executemany 명령에 대해 알아 냈습니다. 내 코드를 다음과 같이 바 꾸었습니다 :
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
여전히 효과가 있었지만 느리게 실행되었습니다. 내 테스트에서 상대적으로 작은 데이터 세트 (약 100-200 행)의 경우 약 6 배 느리게 실행되었습니다. 큰 데이터 세트 (약 13,000 개의 행, 내가 처리 할 것으로 예상되는 최대치)의 경우, 이것은 약 50 배 더 느리게 실행됩니다. 왜이 일을하는거야?
코드를 단순화하고 싶지만 성능이 크게 떨어지는 것을 원하지 않습니다. 누구든지 더 빨리 할 수있는 방법을 알고 있습니까?
저는 파이썬 2.7과 MySQLdb 1.2.3을 사용하고 있습니다. 나는 setinputsizes 함수로 꼼꼼하게 시도했지만 아무 것도하지 않는 것처럼 보였다. 나는 MySQLdb 소스 코드를 보았고 아무 것도해서는 안된다.
삽입/교체 할 행 수는 얼마나됩니까? 두 번째 명령문은 mysql에 넘겨주기 전에 메모리에 거대한리스트를 생성한다. – nosklo
최대 13,000 개의 행을 바꿀 예정입니다. 목록을 만드는 것이 병목이라고 생각하지 않습니다. 목록을 작성했지만 DB 커서에 전달하지 않으면 거의 시간이 걸리지 않습니다. –
(질문에 답할 수는 없지만 ...)'INSERT ... ON DUPLICATE KEY UPDATE ... '는 대체로'REPLACE ...'보다 낫습니다. –