【问题标题】:Best code to generate 1,000,000 files from Database从数据库生成 1,000,000 个文件的最佳代码
【发布时间】:2009-07-10 02:44:17
【问题描述】:

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

【问题讨论】:

  • 他必须是因为他的代码中的 var 关键字。
  • 您真的希望它们都在一个目录中吗?
  • (1) Windows 资源管理器无法处理一个目录中的数千个文件。不过 NTFS 可以。准备通过命令行或以编程方式工作。考虑将文件拆分到子文件夹。 (2) 如果文件名最终比 DOS 8.3 长,NTFS 将为您创建一个短名称。这将减慢 100,000 个文件的速度。禁用短名称。 (3) 如果不是子文件夹,请考虑以允许您分组处理文件的方式命名文件。例如f0000001.txt,而不是 f1.txt。 discuss.fogcreek.com/joelonsoftware/…
  • 我使用 NTFS,我不会使用资源管理器查看文件所有文件名将从 000001.txt 到 999999.txt 都在单个文件夹中
  • 如果这不仅仅是一个一次性的事情,您最好看看使用 Jeffrey Richter 的电源线程库 wintellect.com/PowerThreading.aspxmsdn.microsoft.com/en-us/magazine/cc546608.aspx 中的一些概念

标签: c# multithreading io


【解决方案1】:

由于您的操作受 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队列的方式;众所周知的生产者/消费者问题。

【讨论】:

  • 使用线程池只生成2713个文件并退出我的应用程序。意外行为。
【解决方案2】:

你会从拥有更多线程中受益;找出确切数字的最佳方法是凭经验,但不要像处理 CPU 密集型任务那样将自己限制为每个 CPU 内核一个。最简单的方法是使用 ThreadPool,但生产者/消费者队列系统会更加灵活和可调。

【讨论】:

    【解决方案3】:

    为什么不使用 SSIS 包?不应该做这种事吗?

    【讨论】:

    • 有没有SSIS包生成文件的文章?
    【解决方案4】:

    This 可能会有所帮助。

    【讨论】:

    • 如果您的数据库只有 SQL Server,这将非常有用:) 我希望大多数人都在使用:)
    • 虽然他没有显示连接字符串,但使用 SQLCommand 表明他正在使用 SQL 作为数据库。因此,我想这可以使用。
    • 是的,我使用的是 SQLserver 2008,但我找不到使用 SSIS 将每条记录生成到单个文件中的方法,有人可以帮忙吗?
    • 如果我只使用SSIS中的脚本任务,是不是相当于用c#写代码,还是性能会更好?
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2019-06-04
    • 2013-12-29
    • 2015-12-20
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多