2011-11-22 59 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