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

标签 c# multithreading io

使用 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/

相关文章:

c++ - 如何在 boost HTML3 示例中向服务器发送 SIGTERM 或 SIGINT 信号?

c++ - 静态变量初始化的线程安全

java I/O,将数组写入文本文件

file - 平滑运算符 : Rename a file while writing to it

c# - 具有 Singleton 类的 Azure Auto Scaling

c# - 在结构上隐藏无参数构造函数

c# - MathNet.Numerics x86 中是否包含 SVD?

java - 如何为我的代码启动一个线程,为 JavaFX 应用程序启动一个线程?

c++ - 使用最少的代码行读取 C++ 中的表格数字数据

c# - 你必须调用 Rg.Plugins.Popup.Popup.Init();使用前