- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有更优雅/更快的方式来编写下面的代码?目前大约需要 45 秒。
query.sql 有 200,000 行,每行都有 SQL:
SELECT N'+dave' AS [AccountName], N'20005' AS [EmployeeID], N'-6' AS [PlatformID] UNION ALL
我发现通过将 block 分成 1000 个 block ,事情比等到最后并使用 WriteAllText(运行大约需要 20 分钟)要快得多
static void Main(string[] args)
{
var s = new Stopwatch();
s.Start();
string textToWrite = "";
string[] lines = File.ReadAllLines(@"e:\temp\query.sql");
int i = 0;
foreach (var line in lines)
{
var bits = line.Split('\'');
var value1 = bits[1];
var value2 = bits[3];
var value3 = bits[5];
var message = "INSERT [PreStaging].[Import_AccountEmployeeMapping] ([AccountName], [EmployeeID], [PlatformID]) VALUES (N" +
"'" + value1 + "', "
+ value2 + ", "
+ value3 + ")";
textToWrite += message + Environment.NewLine;
if (i % 1000 == 0)
{
Console.WriteLine(i + " " + DateTime.Now.ToLongTimeString());
File.AppendAllText(@"e:\temp\query2.sql", textToWrite);
textToWrite = "";
}
i++;
}
//File.WriteAllText(@"e:\temp\query2.sql", textToWrite);
File.AppendAllText(@"e:\temp\query2.sql", textToWrite);
s.Stop();
TimeSpan ts = s.Elapsed;
Console.WriteLine("Timespan: {0}m", ts.TotalMinutes);
Console.WriteLine("Total records: " + i);
Console.ReadLine();
}
编辑:StringBuilder 解决方案(1000 毫秒):
static void Main2(string[] args)
{
var s = new Stopwatch();
s.Start();
var textToWrite = new StringBuilder();
string[] lines = File.ReadAllLines(@"e:\temp\query.sql");
int i = 0;
foreach (var line in lines)
{
var bits = line.Split('\'');
var value1 = bits[1];
var value2 = bits[3];
var value3 = bits[5];
var message = "INSERT [PreStaging].[Import_AccountEmployeeMapping] ([AccountName], [EmployeeID], [PlatformID]) VALUES (N" +
"'" + value1 + "', "
+ value2 + ", "
+ value3 + ")"
+ Environment.NewLine;
textToWrite.Append(message);
// Buffering
if (i % 1000 == 0)
{
Console.WriteLine(i + " " + DateTime.Now.ToLongTimeString());
File.AppendAllText(@"e:\temp\query2.sql", textToWrite.ToString());
textToWrite = new StringBuilder();
}
i++;
}
File.AppendAllText(@"e:\temp\query2.sql", textToWrite.ToString());
s.Stop();
TimeSpan ts = s.Elapsed;
Console.WriteLine("Timespan: {0}ms", ts.TotalMilliseconds);
Console.WriteLine("Total records: " + i);
Console.ReadLine();
}
编辑:StreamWriter 解决方案(450 毫秒)
static void Main(string[] args)
{
var s = new Stopwatch();
s.Start();
string[] lines = File.ReadAllLines(@"e:\temp\query.sql");
int i = 0;
using (StreamWriter writer = File.AppendText(@"e:\temp\query2.sql"))
{
foreach (var line in lines)
{
var bits = line.Split('\'');
var value1 = bits[1];
var value2 = bits[3];
var value3 = bits[5];
writer.WriteLine("INSERT [PreStaging].[Import_AccountEmployeeMapping] ([AccountName], [EmployeeID], [PlatformID]) VALUES (N'{0}', {1}, {2})",
value1, value2, value3);
i++;
}
}
s.Stop();
TimeSpan ts = s.Elapsed;
Console.WriteLine("Timespan: {0}ms", ts.TotalMilliseconds);
Console.WriteLine("Total records: " + i);
Console.ReadLine();
}
最佳答案
正如其他人所指出的,使用 StringBuilder
。所以在你的情况下,声明:
StringBuilder textToWrite = new StringBuilder();
然后:
textToWrite.AppendLine(message);
if (i % 1000 == 0)
{
Console.WriteLine(i + " " + DateTime.Now.ToLongTimeString());
File.AppendAllText(@"e:\temp\query2.sql", textToWrite.ToString());
textToWrite = new StringBuilder();
}
虽然你最好完全放弃缓冲:
using (StreamWriter writer = File.AppendText(filename))
{
// initialization stuff here
foreach (var line in lines)
{
var bits = line.Split('\'');
var value1 = bits[1];
var value2 = bits[3];
var value3 = bits[5];
var message = "INSERT [PreStaging].[Import_AccountEmployeeMapping] ([AccountName], [EmployeeID], [PlatformID]) VALUES (N" +
"'" + value1 + "', "
+ value2 + ", "
+ value3 + ")";
writer.WriteLine(message); // write the line
}
}
关于C# 性能 - 使用 AppendAllText 分块写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17999675/
当我在 C# 3.5 中对大量记录进行交互时,我需要通过向其中添加内容来写入一个非常大的文本文件。此文件的大小可能为数 GB。我以为我会在处理每条记录后使用 File.AppendAllText 写入
我有一部分代码写入文本文件。这是应该写入文件的唯一事件进程,这是如何完成的: try { File.AppendAllText(path, '\n' + tmp); } catch (Exce
如果我有一个路径 C:\Test\Test1\a.txt 而 Test1 不存在,我如何确保在附加到 a.txt 之前创建它? 最佳答案 怎么样: Directory.CreateDirectory(
现有代码正在调用 File.AppendAllText(filename, text) 重载以将文本保存到文件。 我需要能够在不破坏向后兼容性的情况下指定编码。如果我要使用 File.AppendAl
执行操作后是否关闭文件? : System.IO.File.AppendAllText(path, text); 是,否就够了吗? 最佳答案 是的,确实如此。 如果没有,之后就没有办法关闭它,因为它不
有没有更优雅/更快的方式来编写下面的代码?目前大约需要 45 秒。 query.sql 有 200,000 行,每行都有 SQL: SELECT N'+dave' AS [AccountName],
我从数据库中获取数据并使用 File.AppendAllText 将每个数据库行写入一个文件,总共 8000 个文件。整个过程在一个循环(查询)中重复,而且似乎要花很长时间。有没有更好的方法去做这件事
我想创建一个日志文件来跟踪我的应用程序中的一些操作。在我的一个 session 场景中,我想每分钟至少记录 50 次。目前我正在使用 StremWriter 创建日志文件。 public stati
关于防止“已在使用”错误,我想问一下,如果从多个客户端多次调用,第一个代码片段是否可能存在危险?还是两个代码块都同样安全? 我问是因为第二个代码片段调用了一个 close 方法,该方法也进行了一个听起
问题 File.AppendAllText 是否管理来自多个作者的冲突? 研究 我注意到 MSDN documentation并没有真正提供任何一种方式,所以我决定我会反射(reflect)代码并看看
我正在阅读来自 msdn 的 File.AppendAllText 方法 http://msdn.microsoft.com/en-us/library/ms143356.aspx 我看到他们已将 F
是否有一些干净的静态方法可以将字符串转储(附加)到文件中? 最佳答案 不,我所知道的最接近的是: FileWriter writer = new FileWriter(fname, true); wr
作为无聊的好奇心练习,考虑以下简单的日志记录类: internal static class Logging { private static object threadlock; s
为了使用 File.CreateText() 和 File.AppendText() 你必须: 通过调用这些方法之一打开流 写消息 关闭流 处理流 为了使用 File.AppendAllText()
我是 Unity3d 的新手,尝试打开一个现有项目。播放时显示以下错误。 Assets/Scripts/DataAccess.cs(39,30):错误 CS0117:System.IO.File' 不
我正在编写一个简单的键盘记录程序(用于非恶意目的)。 注意:这是 .net 4.0 客户端配置文件 每当我启动程序时,我都会收到此错误: The process cannot access the f
我是一名优秀的程序员,十分优秀!