使用C#,我想从DB生成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();
答案 0 :(得分:3)
由于您的操作是IO绑定而不是CPU绑定,最好的方法是有2个线程,一个从DB读取记录并将其放入队列,另一个从队列中读取并生成文件。
或者,您可以使用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个队列方法;众所周知的生产者/消费者问题。
答案 1 :(得分:0)
你可以从拥有更多线程中受益;根据经验确定确切数字的最佳方法,但不要像CPU绑定任务那样限制每个CPU核心。最简单的方法是使用ThreadPool,但生产者/消费者排队系统将更灵活和可调。
答案 2 :(得分:0)
为什么不使用SSIS包?是不是应该做这些事情?
答案 3 :(得分:0)
This可能会有所帮助。