2013-06-19 13 views
1

全部。 我使用從dbf(vfp)文件到oracle db的python加載數據。但是,效率並不好。創紀錄的700萬花費40分鐘。只有我想減少循環,這是關鍵點。代碼如下:Python:如何提高從vfp(dbf)到oracle的加載數據的效率?

import sys 
import cx_Oracle 
from dbfpy.dbf import * 

dbhost=sys.argv[1] 
dbport=sys.argv[2] 
dbsid=sys.argv[3] 
dbuser=sys.argv[4] 
dbpasswd=sys.argv[5] 
schema=sys.argv[6] 
tbname=sys.argv[7] 
vdate=sys.argv[8] 
organ=0 
gap=5000 

tns = cx_Oracle.makedsn(dbhost,dbport,dbsid) 
db = cx_Oracle.connect(dbuser,dbpasswd,tns) 
execsql = 'truncate table ' + schema + '.' + tbname 
cur = db.cursor() 
cur.execute(execsql) 

count=0 
param=[]; 
execsql='insert into '+ schema + '.' + tbname + ' values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11)' 
dbf = Dbf("E:\abc.dbf") 
for rec in dbf: 
    param.append((vdate,rec['ZQ'],rec['TZ'],rec['TX'],rec['ZJ'],rec['ZJM'],rec['CQ'],rec['DH'],rec['RQ'],rec['ZZT'],rec['DXW'])) 
    count += 1 
    if count >= gap: 
     cur.executemany(execsql,param); 
     db.commit() 
     param=[]  
     count = organ 

if param: 
    cur.executemany(execsql,param); 
    db.commit() 
cur.close() 
db.close() 
dbf.close() 

每個人都可以幫我提高效率嗎?

+0

大部分時間可能花費來回發送少量數據。例如,通過將10個插入組合成一個單獨的語句,比如'insert into table select'1'... from dual union,所有選擇'2'... from dual',通常可以使這些過程運行幾次,速度更快。 –

回答

1

Oracle是否支持從.csv文件讀取數據?如果是這樣,請my dbf package創建.csv文件,必要的字段(像這樣(未經)):

import dbf 

with dbf.Table(r'c:\abc.dbf') as t: 
    dbf.export(t, field_names='ZQ, TZ, TX, ZJ, ZJM, CQ, DH, RQ, ZZT, DXW') 

這將與那些字段中的數據來創建c:\abc.csv

+0

我想我看到你的意思。首先生成dbf文件到csv文件,第二個用戶sqlldr將csv文件加載到oracle中?恐怕生成csv文件可能花費很多時間。不管怎樣,我會很快嘗試它。謝謝你許多 – gobird