2012-04-19 79 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是空的,或者你不想保留任何先前更改现有的数据 - 它更是更快的方式。