2011-11-22 57 views
1

我正在閱讀CSV文件並將數據從CSV文件保存到我的數據庫。如何提高CSV閱讀性能

我使用StreamreaderReadLine()來讀取每一行,然後將其插入到我的數據庫,這是工作正常。但在分析我的代碼後,我注意到ReadLine()佔用了太多時間。

如何提高我的任務績效

請爲我提供其他選項。

性能是這裏的主要關注點。

+0

您的CSV文件有多大?你能把它分成更小的文件嗎? –

+0

這是我的代碼: using(StreamReader readFile = new StreamReader(filePath)) { \t string line; \t而((行= readFile.ReadLine())!= NULL){ \t \t //將每行DB \t}} 和 我的CSV文件的大小非常大(100 MB +) 我沒有嘗試過分成小文件。 我主要關心的是從csv中讀取一行並將其插入到數據庫表中。 – MSHAN

+0

正如@Barry所說,使用BulkInsert將結果插入到數據庫中。您也可以拆分文件並使用任務並行庫來讀取花費更少的時間讀取文件。 –

回答

0

您確定StreamReader.ReadLine是這裏的緩慢部分嗎? 我猜插入數據到數據庫是很多比從本地文件中讀取一行文本慢!

如果文件不太大,您可以嘗試使用System.IO.File.ReadAllLines()將文件讀入內存。

+0

我上面提到的我的csv文件是非常大的文件,我可以將整個文件讀入使用流讀取器的內存中嗎?這是不是好的做法。如果是這樣,我該怎麼做? – MSHAN

+0

你可以在我寫的時候用'System.IO.File.ReadAllLines()'讀取整個文件。當可能性存在時,文件大小將超出你的記憶它不是很好的做法 – Jan

+0

Thars正確。那麼,還有什麼可能實現我的關注? – MSHAN

2

對於此MSDN link,您可以使用SqlBulkCopy類。它比單獨的逐行插入快一個數量級。 MSDN頁面有一個完整的例子。

您還可以使用StreamReader.Peek方法 - MSDN link加快讀取速度。 MSDN鏈接也是一個很好的例子。

+1

正如OP所示,如果瓶頸在於讀取CSV,將無法提供幫助。 – Oded

+0

如何使用SqlBulkCopy將我的csv文件數據插入到數據庫表中。而我的csv文件的大小非常大(100 MB +)。 – MSHAN

+0

在這裏,我們已經使用SqlBulkCopy來插入數據。然後我還發現ReadLine()方法花費很多時間。請給我們介紹一些其他的最佳解決方案嗎? – MSHAN

0

我建議使用許多CSV解析庫之一 - 您應該測試它們以瞭解它們的性能。

FileHelpers是一個流行的庫,並且codeproject也有severaldifferent個。

然而,有可能問題在於逐行插入到數據庫中。

您應該儘可能多地向數據庫讀取文件,而不是逐行讀取文件。

+0

我的csv文件的大小很大..在執行代碼分析時,我發現readLine()方法需要很長時間.. – MSHAN

+0

@MSHAN - 正如我所說的,使用現有的CSV庫。其中許多非常快。 – Oded