Eoi*_*ell 4 c# sql sql-server .net-3.5 linq-to-sql
我们有一个小的c#工具,我们将它们拼凑在一起来解析数据文件,构建一些对象并将它们插入到数据库中.
逻辑本质上是.
string [] lines = File.ReadAllLines("C:\\Temp\\Data.dat")
foreach(string line in lines)
{
MyDataObject obj = ParseObject(line);
myDataContext.MyDataObjects.InsertOnSubmit(obj);
}
myDataContext.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
这在一开始就很好,因为数据文件每天只有大约1000行,但是最近这个文件已经增长到大约30,000行,并且这个过程变得非常缓慢.
SubmitChanges()调用的所有内容都很好,但是一旦开始向数据库转储30,000个插入的过程,它就会停止运行.作为一项测试,我发了30,000个插入语句并直接从QA运行.花了大约8分钟.
8分钟后,C#/ Linq版本仅完成了大约25%的插入.
有人建议我如何优化这个吗?
如果你正在编写大量的同类数据,SqlBulkCopy可能是一个更合适的工具,例如可能CsvReader用于读取行(因为SqlBulkCopy可以接受一个IDataReader,这意味着你不必将所有30k行缓冲到内存中).
如果数据是CSV,则可以这样简单:
using (CsvReader reader = new CsvReader(path))
using (SqlBulkCopy bcp = new SqlBulkCopy(CONNECTION_STRING))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)
如果数据更复杂(非CSV),则SimpleDataReader可能有用 - 您只需将其子类化并添加代码以表示每行的数据.