使用 C#,我想从数据库生成 1,000,000 个文件,每个记录在单独的文件中。 在最短时间内生成此文件的最佳方法是什么?
这是我的没有线程的代码:
AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); // to calculate the execution time in case of using threading
SqlCommand cmd = new SqlCommand(@"select top 1000000 p1+','+p2+','+p3+','+p4 as line from lines ", con);
con.Open();
var rdr = cmd.ExecuteReader();
int i = 0;
while (rdr.Read())
{
string line = rdr.Getring(0);
string filename = String.Format("file{0}.txt", ++i);
File.WriteAllText(filename, line);
}
rdr.Close();
con.Close();
最佳答案
由于您的操作受 IO 限制而不是 CPU 限制,因此最好的方法是使用 2 个线程,一个从数据库读取记录并将其放入队列,另一个从队列读取并生成文件。
或者,您可以使用 CLR 线程池,例如
while (rdr.Read())
{
string line = rdr.Getring(0);
ThreadPool.QueueUserWorkItem (new WaitCallback(writeData), line);
}
和 writeData 看起来像
static void writeData(Object line)
{
string filename = String.Format("file{0}.txt", ++i);
File.WriteAllText(filename, line);
}
使用ThreadPool的缺点是你可能会得到比你想要的更多的线程,因为你的线程大部分时间都会被IO阻塞,线程池将创建新的线程来服务你的请求。
可以先尝试一下线程池,衡量一下性能,如果不满意,可以尝试2线程1队列的方式;众所周知的生产者/消费者问题。
关于c# - 从数据库生成 1,000,000 个文件的最佳代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1107435/