在 C# 效率问题中将 DB table 转储到平面文件
Dumping a DB table to a flat file in C# efficiency issue
我在使用 C# 而不是 SSIS 转储平面文件时遇到效率问题。我所做的就是将大约 10 万行的数据库 table (SqlServer) 转储到文本文件中。使用 SSIS 这需要不到一秒钟,而使用下面的 C# 代码需要一分钟,这是 unacceptable。我做错了什么?:
while (Reader.Read())
{
foreach (string ColumnName in cols)
{
sb.Append('"' + Reader[ColumnName].ToString() + "\",");
}
//save lines to file
WriteLineToFile(TableDefinition.GetTableName(), sb.ToString());
sb.Clear();
}
注意:sb
变量是 StringBuilder
。此代码转储多个 table,因此 while
循环中的 Reader.Read()
。查询本质上是列表
中每个table的select * from tablename
WriteLineToFile 方法:
public static void WriteLineToFile(string TableName, string Text)
{
System.IO.File.AppendAllText(OutputDir + @"\" + TableName + ".dat", Text + "\r\n");
}
简而言之,SSIS 最有可能执行数据库读取和导出的批量操作(此处有更多详细信息:SQL Server Bulk Operations)并且您的应用程序一次写入一行文件,效率明显较低。
您还没有发布从数据库读取的 C# 代码,因此我无法对此发表评论,但那里也可能存在类似的低效率问题。
因此根据 documentation 这打开和关闭文件,System.IO.File.AppendAllText()
看起来好像您出错了。这样的IO操作通常是比较昂贵的。
您可能需要重组循环,以便打开文件一次,将所有行写入其中,然后关闭文件。
var lines = new List<string>();
while (Reader.Read())
{
foreach (string ColumnName in cols)
{
sb.Append('"' + Reader[ColumnName].ToString() + "\",");
}
lines.Add(sb.ToString());
sb.Clear();
}
var path = OutputDir + @"\" + TableName + ".dat";
File.WriteAllLines(path, lines, Encoding.UTF8);
我在使用 C# 而不是 SSIS 转储平面文件时遇到效率问题。我所做的就是将大约 10 万行的数据库 table (SqlServer) 转储到文本文件中。使用 SSIS 这需要不到一秒钟,而使用下面的 C# 代码需要一分钟,这是 unacceptable。我做错了什么?:
while (Reader.Read())
{
foreach (string ColumnName in cols)
{
sb.Append('"' + Reader[ColumnName].ToString() + "\",");
}
//save lines to file
WriteLineToFile(TableDefinition.GetTableName(), sb.ToString());
sb.Clear();
}
注意:sb
变量是 StringBuilder
。此代码转储多个 table,因此 while
循环中的 Reader.Read()
。查询本质上是列表
select * from tablename
WriteLineToFile 方法:
public static void WriteLineToFile(string TableName, string Text)
{
System.IO.File.AppendAllText(OutputDir + @"\" + TableName + ".dat", Text + "\r\n");
}
简而言之,SSIS 最有可能执行数据库读取和导出的批量操作(此处有更多详细信息:SQL Server Bulk Operations)并且您的应用程序一次写入一行文件,效率明显较低。
您还没有发布从数据库读取的 C# 代码,因此我无法对此发表评论,但那里也可能存在类似的低效率问题。
因此根据 documentation 这打开和关闭文件,System.IO.File.AppendAllText()
看起来好像您出错了。这样的IO操作通常是比较昂贵的。
您可能需要重组循环,以便打开文件一次,将所有行写入其中,然后关闭文件。
var lines = new List<string>();
while (Reader.Read())
{
foreach (string ColumnName in cols)
{
sb.Append('"' + Reader[ColumnName].ToString() + "\",");
}
lines.Add(sb.ToString());
sb.Clear();
}
var path = OutputDir + @"\" + TableName + ".dat";
File.WriteAllLines(path, lines, Encoding.UTF8);