2009-12-09 83 views
0

我已經編寫了用於連接數據並將數據提取到文件中的程序,但是這個程序在讀取時速度很慢。有沒有什麼辦法可以提高性能和更快的方式將數據加載到文件中。我的目標是大約10萬到100萬條記錄,所以這就是爲什麼iam擔心性能,我也可以使用數組獲取大小和批處理大小,因爲我們可以在java中完成。如何提高性能和速度

import java.sql as sql 
import java.lang as lang 
def main(): 
    driver, url, user, passwd = ('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@localhost:1521:xe','odi_temp','odi_temp') 
    ##### Register Driver 
    lang.Class.forName(driver) 
    ##### Create a Connection Object 
    myCon = sql.DriverManager.getConnection(url, user, passwd) 
    f = open('c:/test_porgram.txt', 'w') 
    try: 
     ##### Create a Statement 
     myStmt = myCon.createStatement() 
     ##### Run a Select Query and get a Result Set 
     myRs = myStmt.executeQuery("select emp_id ,first_name,last_name,date_of_join from src_sales_12") 
     ##### Loop over the Result Set and print the result in a file 
     while (myRs.next()): 
      print >> f , "%s,%s,%s,%s" %(myRs.getString("EMP_ID"),myRs.getString("FIRST_NAME"),myRs.getString("LAST_NAME"),myRs.getString("DATE_OF_JOIN")) 
    finally: 
     myCon.close() 
     f.close() 

### Entry Point of the program 
if __name__ == '__main__': 
    main() 
+0

這將有助於瞭解有多慢(每條記錄)以及您正在使用的硬件。需要找到你的瓶頸。 – SamuelWarren 2009-12-09 17:14:24

回答

0

難道你不能只使用Oracle命令行SQL客戶端將查詢結果直接導出到CSV文件嗎?

+0

以及試圖做出通用程序,以便ican更改數據庫連接和驅動程序,並仍然適用於任何數據庫。 – kdev 2009-12-09 17:24:18

+0

換句話說,「寫一次,到處跑,很慢」。 – APC 2009-12-09 17:54:03

+0

@APC:Jython *是* Java之上的Python。 – David 2009-12-09 18:28:30

0

您可以使用帶硬編碼索引的getString而不是列名(在打印語句中),這樣程序就不必一遍又一遍地查找名稱。此外,我不太瞭解Jython/Python文件輸出以說明這是否默認啓用,但您應該嘗試確保您的輸出緩衝。

編輯:

要求

代碼(我並沒有這個代碼的正確性索賠):

print >> f , "%s,%s,%s,%s" %(myRs.getString(0),myRs.getString(1),myRs.getString(2),myRs.getString(3)) 

myRs = myStmt.executeQuery("select emp_id ,first_name,last_name,date_of_join from src_sales_12") 
hasFirst = myRs.next() 
if (hasFirst): 
    empIdIdx = myRs.findColumn("EMP_ID") 
    fNameIdx = myRs.findColumn("FIRST_NAME") 
    lNameIdx = myRs.findColumn("LAST_NAME") 
    dojIdx = myRs.findColumn("DATE_OF_JOIN") 
    print >> f , "%s,%s,%s,%s" %(myRs.getString(empIdIdx),myRs.getString(fNameIdx),myRs.getString(lNameIdx),myRs.getString(dojIdx)) 
    ##### Loop over the Result Set and print the result in a file 
    while (myRs.next()): 
     print >> f , "%s,%s,%s,%s" %(myRs.getString(empIdIdx),myRs.getString(fNameIdx),myRs.getString(lNameIdx),myRs.getString(dojIdx)) 
+0

可以請你給我一個關於如何使用硬編碼索引獲取字符串的例子。 – kdev 2009-12-09 17:55:04

+0

感謝各位的幫助 – kdev 2009-12-10 13:06:42

0

如果你只是想將數據提取到文件,你可以嘗試使用數據庫工具(例如「load」,「export」)。

1

除非您是DB和文件服務器上最好,最好的設備,或者運行腳本的最糟糕的設備,否則此應用程序是I/O綁定的。從數據庫返回select之後,數據的實際移動將比Jython,Java或此代碼中的任何低效率更爲主導。

你在這個過程中CPU基本上是無意識的,你根本沒有做足夠的數據轉換。你可以寫一個比I/O慢的進程,但這不是其中之一。

你可以用C寫這個,我懷疑你會看到實質性的差異。

0

您可能還會發現,如果您在SQL select語句中構建了進入文件的字符串,那麼您將獲得更好的性能。

所以你的SQL選擇應該是SELECT EMP_ID || ','|| FIRST_NAME || ','|| LAST_NAME || ','|| DATE_OF_JOIN MY_DATA ...(取決於數據庫和分隔符)

然後在您的java代碼中,您只需獲取一個字符串empData = myRs.findColumn(「EMP_DATA」)並將其寫入文件。我們已經看到這樣做有顯着的性能優勢。

另一件您可能會看到的好處是將JDBC連接更改爲使用更大的讀取緩衝區 - 而不是一次抓取30行,獲取5000行。

+0

不是回答這個問題 – user1972007 2012-11-30 08:28:30