2013-05-31 48 views
0

我正在使用Java讀取大型文本文件。該文件有5.000.000行,每個有3列。文件大小爲350 MB。使用Criteria多次插入Postgresql的速度非常慢

對於每一行,我讀了它,我使用Maven上的Criteria創建了一個對象,然後使用session.saveOrUpdate(object)命令將它存儲到Postgresql數據庫中。

在數據庫中,我有一個包含序列標識和三個屬性的表,其中存儲了文件的三列。

開始時,進程運行「快速」(30分鐘內爲35.000個寄存器),但每次都比較慢,結束時間按指數規律增長。我如何改進過程?

我試圖將大文件拆分成幾個較小的文件,但它幾乎變慢。

非常感謝提前!

PD:代碼

public void process(){ 

    File archivo = null; 

    FileReader fr = null; 
    BufferedReader br = null; 

    String linea; 
    String [] columna; 

    try{ 
     archivo = new File ("/home/josealopez/Escritorio/file.txt"); 

     fr = new FileReader (archivo); 
     br = new BufferedReader(fr); 

     while((linea=br.readLine())!=null){ 
      columna = linea.split(";"); 
      saveIntoBBDD(columna[0],columna[1],columna[2]); 
     } 
    } 
    catch(Exception e){ 
      e.printStackTrace(); 
    } 

    finally{ 
     try{     
      if(null != fr){ 
       fr.close(); 
      }  
     } 
     catch (Exception e2){ 
      e2.printStackTrace(); 
     } 
    } 
} 

@CommitAfter 
public void saveIntoBBDD(String lon, String lat, String met){ 
    Object b = new Object(); 
    b.setLon(Double.parseDouble(lon)); 
    b.setLat(Double.parseDouble(lat)); 
    b.setMeters(Double.parseDouble(met)); 
    session.saveOrUpdate(b); 
} 
+0

請顯示一些代碼! –

+0

@DonRoby我剛剛編輯帖子以添加代碼。非常感謝 –

+1

'對於每一行,我讀了它,我使用Maven上的Criteria創建了一個對象,並將它存儲到Postgresql中......'您正在執行*一次一行*處理。每行將花費您對數據庫的一個請求/響應。對於5M行,這將花費你*約10M *幾毫秒的延遲。 – joop

回答

2

你應該專注於運行此作爲本體法和基於行的處理是你的問題在這裏。 PostgreSQL內置了批量文件加載命令,名爲COPY,可以處理逗號分隔文件和製表符分隔文件。當然,分隔符,引號字符和許多其他設置都是可定製的。

請檢查關於DB population的官方PostgreSQL文檔以及COPY命令的詳細信息。

this answer我提供了一個我如何做類似事情的小例子。

+0

非常感謝!我會嘗試 –