2009-08-28 9 views
0

나는 파이썬 스크립트로 beginar이다. msaccess 데이터베이스 레코드를 읽고 XML 파일에 기록하고 싶습니다. 액세스 데이터베이스 테이블에 20000 개가 넘는 레코드가 있습니다.파이썬의 스레드

이제 할 수 있지만 4 분에서 5 분 정도 걸립니다. 그래서 스레딩 개념을 구현합니다. 그러나 스레딩은 5 ~ 6 분 이상 걸립니다. 각 스레드는 테이블에서 레코드를 읽는 데이터 소스를 열고 데이터 소스를 닫습니다.

문제를 해결하는 방법을 모르겠습니다.

코드 :

class ConfigDataHandler(Thread): 

    def __init__(self, dev): 
    Thread.__init__(self) 
    self.dev = dev 

    def run(self):  
    db_source_path = r'D:\sampleDB.mdb' 
    db_source = win32com.client.Dispatch(r'ADODB.Connection') 
    db_source.ConnectionString = 'PROVIDER=Microsoft.Jet.OLEDB.4.0; 
           DATA SOURCE=' + db_source_path + ';' 
    db_source.Open() 

    query = """ SELECT * from table""" 
    source_rs = win32com.client.Dispatch(r'ADODB.Recordset') 
    source_rs.Open(query, db_source, 3, 1) 

    while not source_rs.EOF : 
     f_units.append(source_rs.fields("Name").Value)) 
     source_rs.MoveNext() 
    source_rs.Close() 
    db_source.Close() 

    out = render(f_units) 
    open("D:/test.xml", "w").write(out) 

d_list = get_dev_list() 
for d in d_list:  
    current = ConfigDataHandler(d) 
    current.start() 
+0

여기에 코드 스 니펫을 붙여주십시오. –

+1

프로파일 러를 사용하여 시간이 소비 된 곳을 확인 했습니까? 나는 시간의 80 %가 Jet에 대한 ODBC 연결에 있다고 확신합니다. 몇 가지 사실을 수집하기 위해 프로그램을 프로파일 링 할 수 있습니까? –

답변

5

당신의 코드를 붙여 주시기 바랍니다 언급 한 바와 같이. 첫 번째 스레드는 동기화 오버 헤드로 인해 다중 스레드가 더 느리게 실행됩니다.

둘째 - msaccess/JET 데이터베이스는 매우 느리고 멀티 스레드 사용에는 적합하지 않습니다. 대신 SQL Server를 고려해보십시오. SQL Server Express는 무료입니다.

셋째, 아마 처리 속도가 느려지는 데이터베이스 일 것입니다. 어떤 색인이 있습니까? 어떤 쿼리를 만들고 있습니까? "설명하는"무엇을 말하는가?

+4

+1 : 스레드가 I/O 바운드 프로그램을 "마술처럼"더 빠르게 만들지 않습니다. –

+0

코드를 게시 해 주셔서 감사합니다. 나는 몇 가지 문제를 즉시 볼 수있다. self.dev가 사용되지 않습니다. 아마도 SQL 쿼리를 위해 WHERE 절에서 self.dev를 사용하고 싶을 것이다. 매번 데이터베이스를 다시 열지 않고 (self.db_source?) 매번 XML 파일을 다시 열지 않는 것이 훨씬 빠릅니다. 또한 'w'모드에서 같은 파일을 열면 매번 내용이 지워집니다. – teambob

0
  1. 스레딩 내용을 취소하십시오.

  2. 원래 unthreaded 코드에 profiler을 실행하십시오.

  3. 일반 ODBC로 AODB 업무를 대체하십시오.

  4. 프로파일 러를 통해 새 코드를 실행하십시오.

  5. 추가 토론을 위해 결과를 게시하십시오.