从数据库生成1,000,000个文件的最佳代码

时间:2009-07-10 02:44:18

标签: c# multithreading io

使用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();

4 个答案:

答案 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可能会有所帮助。