如何以最有效的方式将大量的CSV数据(300万+行)加载到数据库中?
- 数据需要进行格式化(例如,将姓名列拆分为名字和姓氏等)
- 需要在尽可能短的时间内高效地完成此操作
我倾向于使用C#应用程序逐行读取、转换和加载数据。如果这不是理想的选择,那么我的其他选择是什么? 我需要使用多线程吗?
如何以最有效的方式将大量的CSV数据(300万+行)加载到数据库中?
我倾向于使用C#应用程序逐行读取、转换和加载数据。如果这不是理想的选择,那么我的其他选择是什么? 我需要使用多线程吗?
你将受到I/O限制,因此多线程并不一定会使它运行得更快。
上次我用C#写了大约十几行代码。在一个线程中,它以硬盘能够读取磁盘的速度运行。我从源文件中逐行读取。
如果你不想自己编写,可以尝试FileHelpers库。你也可以看看Sébastien Lorion's work。他的CSV阅读器是专门处理性能问题的。
CachedCsvReader
将数据读入DataTable中,然后使用SqlBulkCopy将其加载到SQL Server中。您没有说明使用的是哪个数据库,但考虑到您提到的语言是C#,我会假设您使用的是SQL Server。
如果数据无法使用BCP导入(如果需要进行大量处理,则似乎不行),那么SSIS很可能是下一个最快的选项。它不是世界上最好的开发平台,但它非常快。肯定比您在任何合理时间范围内编写的任何应用程序都要快。
BCP非常快,因此我会使用它来加载数据。对于字符串操作,我会在SQL上使用CLR函数,一旦数据到位。在这种情况下,多线程不会有帮助,只会增加复杂性并降低性能。
逐行读取CSV文件内容到内存中的DataTable。您可以在填充DataTable时操作数据(例如:拆分名字和姓氏)等。
一旦CSV数据已经加载到内存中,然后使用SqlBulkCopy将数据发送到数据库。
有关文档,请参见http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx。