2011-07-13 133 views
1

場景 - 數據庫中有大量數據。實用程序使用數據讀取器逐個讀取記錄並附加到txt/xml文件。原本用於讀取一條記錄的實用程序,將其寫入文件;然後我改變它,以便讀取大約10k條記錄並將其放入內存(stringbuilder),然後刷新到文件等。時間縮短非常好。從數據庫讀取並寫入文件

所以,我想文件I/O是瓶頸。我想進一步改進它。思考使用某種緩衝區,然後使用一個線程從DB中讀取並放入緩衝區,另一個線程從緩衝區中讀取並寫入File。

這是可能的。從哪兒開始? 有更好的選擇嗎?

+0

首先 - 您可以以多快的速度讀取數據,以及您可以以多快的速度寫入數據?你目前的吞吐量是多少? – Arafangion

+0

大約400萬條記錄 - 讀取單個記錄,寫入文件(所花費的時間 - 6分鐘) - 讀取10k條記錄,寫入文件(花費的時間 - 1分40秒) - 讀取20k條記錄,寫入文件(花費的時間 - 1分鐘50s) – EagerToLearn

+0

稍微慢一點,讀取兩倍的記錄 - 有趣。這裏必須有一個很大的設置成本。 – Arafangion

回答

0

起點將使用兩個緩衝區,並將緩衝區內容異步寫入文件。例如:

buffera 
bufferb 
currentbuffer=buffera 

fill currentbuffer with data 
kickoff job to write currentbuffer to file 
wait for previous write job to finish, if relevant.  
currentbuffer=otherbuffer 

重複,直到完成。

+0

這應該讓你知道你是否可以通過使用多線程來改進。當然,寫作過程必須在一個線程中完成,所以wach將不得不等待上一個 - 也許鎖定該部分。爲了達到這個目的,它應該很簡單,看看它有多大的差異。 –

0

如果您確實需要更好的性能,那麼您可以像現在這樣讀取10k數據塊中的數據,將開始/結束值傳遞到數據庫並同時寫入它們以使用多線程分隔文件。完成後,您連接/合併/附加文件。寫入單個文件只能有很大的改進,因爲數據寫入必須是順序的。

類似,

using (var output = File.Create("output")) 
{ 
    foreach (var file in new[] { "file1", "file2" }) 
    { 
     using (var input = File.OpenRead(file)) 
     { 
      input.CopyTo(output); 
     } 
    } 
} 

不知道它是否真的大幅度提高性能,但值得一試。

相關問題