2012-04-19 76 views
2

我目前使用Codeproject中的自定義CSV類來創建一個CSV對象。然後我用它來填充一個DataTable。根據分析,這比我想要的花費更多的時間,我想知道是否有更有效的方法來做到這一點?提高DataTable.Load()性能的方法?

CSV包含約2,500行和500列。

的CSV讀者爲:http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

StreamReader s = new StreamReader(confirmedFilePath); 
CsvReader csv = new CsvReader(s, true); 
DataTable dt = new DataTable(); 
dt.Load(csv); 

我碰到一個谷歌搜索建議DataAdapter的,但它是唯一一個提到這一點?我進一步搜索,但沒有找到任何合作。

+1

'根據分析,這比我想要更多的時間'。在做手術時不要分析。分析非常CPU,內存和IO密集型。 – Oded 2012-04-19 13:29:48

+0

我明白,但它與代碼的其餘部分完全相稱。我知道代碼運行速度慢了大約5-7倍......所以我可以計算出Load()函數在沒有探查器的情況下需要多長時間,並且它仍然有點長。 – mezamorphic 2012-04-19 13:31:18

+0

您可以使用'秒錶'來精確計時。 – Oded 2012-04-19 13:33:56

回答

0

GenericParser試試。

+1

-1:請不要發佈只包含鏈接的答案。鏈接中斷。至少指出或引用回答問題的頁面部分,並告訴提問者_why_您認爲此頁面回答了他們的問題。 – 2012-04-19 14:34:56

1

CsvReader是快速和可靠的,我幾乎可以肯定你找不到更快的CSV文件(如果有的話)。

限制來自DataTable處理新數據,2500 * 500那是qiute的數量。我認爲最快的方式是直接CsvReader-> DataBase(ADO.NET)鏈。

0

從數據庫填充時,始終使用BeginLoadData()EndLoadData(),因爲它們自己已經實施了約束 - 唯一的缺點是CSV文件顯然不是,因此只有在整個操作結束後才拋出任何異常。

... 
dt.BeginLoadData(); 
dt.Load(csv, LoadOption.Upsert); 
dt.EndLoadData(); 

編輯:使用LoadOption.Upsert只有在DataBase是空的,或者你不想保留任何先前更改現有的數據 - 它更是更快的方式。