2010-01-17 147 views
1

我想從一個mysql設置移動到一個postgres,並且我遇到麻煩的一個字段是一個mysql LBLOB。我正試圖將它移到postgres中的LargeObject類型中,並且我遇到了一些速度問題。我在Java/Groovy中這樣做,坦率地說,流媒體業務讓我感到困惑。從一個數據塊讀取BLOB到另一個數據庫

我試過兩種方法:將LBLOB保存在內存中,並直接寫入LO,然後將LBLOB寫入磁盤(畢竟它是一個文件),然後將文件讀回到LO中。

第二種方法要快很多倍,我不知道爲什麼,因爲我認爲它仍然太慢。

這是第一種方法。

InputStream ins = rs.getBinaryStream(1); 
def b 
while ((b = ins.read()) > -1) { 
    obj.write(b.toInteger().byteValue()) 
} 

「插件」是一個ByteArrayInputStream,所以我讀到,在(爲int),然後將其寫入「目標文件」的LO。這對於1MB文件大約需要7分鐘。我的直覺告訴我這應該比第二個更有效率,但事實並非如此。

我會騰出代碼片段寫入文件版本,但它非常基本。它以同樣的方式從數據庫中讀取數據,然後將輸出寫入磁盤上的文件。然後我從磁盤讀取文件並將其寫入LO。該方法對於同一個文件大約需要8秒。

這是怎麼回事?

回答

2
obj.write(b.toInteger().byteValue()) 

這種方法看起來效率不高。

嘗試緩衝I/O:

public void drain(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int r; 
    while ((r = in.read(buffer)) > -1) { 
     out.write(buffer, 0, r); 
    } 
    } 

調諧緩衝區大小適當。

如果文件很大,您可能會發現操作系統執行磁盤緩存(磁盤I/O,加上內存管理)的問題。從互聯網的這一端很難肯定地說。嘗試分析並比較兩種方法(最低限度,您可以使用-Xprof command line switch)。

+0

我發誓我也這樣做了,但最終因爲某些未知原因而改爲我提交的代碼。我原本認爲差異可以忽略不計,但現在我想我一定沒有計時這個版本。這是答案。謝謝。 – 2010-01-17 19:08:56

相關問題