場景 - 數據庫中有大量數據。實用程序使用數據讀取器逐個讀取記錄並附加到txt/xml文件。原本用於讀取一條記錄的實用程序,將其寫入文件;然後我改變它,以便讀取大約10k條記錄並將其放入內存(stringbuilder),然後刷新到文件等。時間縮短非常好。從數據庫讀取並寫入文件
所以,我想文件I/O是瓶頸。我想進一步改進它。思考使用某種緩衝區,然後使用一個線程從DB中讀取並放入緩衝區,另一個線程從緩衝區中讀取並寫入File。
這是可能的。從哪兒開始? 有更好的選擇嗎?
場景 - 數據庫中有大量數據。實用程序使用數據讀取器逐個讀取記錄並附加到txt/xml文件。原本用於讀取一條記錄的實用程序,將其寫入文件;然後我改變它,以便讀取大約10k條記錄並將其放入內存(stringbuilder),然後刷新到文件等。時間縮短非常好。從數據庫讀取並寫入文件
所以,我想文件I/O是瓶頸。我想進一步改進它。思考使用某種緩衝區,然後使用一個線程從DB中讀取並放入緩衝區,另一個線程從緩衝區中讀取並寫入File。
這是可能的。從哪兒開始? 有更好的選擇嗎?
起點將使用兩個緩衝區,並將緩衝區內容異步寫入文件。例如:
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
重複,直到完成。
這應該讓你知道你是否可以通過使用多線程來改進。當然,寫作過程必須在一個線程中完成,所以wach將不得不等待上一個 - 也許鎖定該部分。爲了達到這個目的,它應該很簡單,看看它有多大的差異。 –
如果您確實需要更好的性能,那麼您可以像現在這樣讀取10k數據塊中的數據,將開始/結束值傳遞到數據庫並同時寫入它們以使用多線程分隔文件。完成後,您連接/合併/附加文件。寫入單個文件只能有很大的改進,因爲數據寫入必須是順序的。
類似,
using (var output = File.Create("output"))
{
foreach (var file in new[] { "file1", "file2" })
{
using (var input = File.OpenRead(file))
{
input.CopyTo(output);
}
}
}
不知道它是否真的大幅度提高性能,但值得一試。
首先 - 您可以以多快的速度讀取數據,以及您可以以多快的速度寫入數據?你目前的吞吐量是多少? – Arafangion
大約400萬條記錄 - 讀取單個記錄,寫入文件(所花費的時間 - 6分鐘) - 讀取10k條記錄,寫入文件(花費的時間 - 1分40秒) - 讀取20k條記錄,寫入文件(花費的時間 - 1分鐘50s) – EagerToLearn
稍微慢一點,讀取兩倍的記錄 - 有趣。這裏必須有一個很大的設置成本。 – Arafangion