当前位置:编程学习 > C#/ASP.NET >>

C#多线程处理一千多万条数据。。。


读txt文件 写入数据库  不会用多线程 所以很卡 很慢  
  喜欢大神帮帮忙  怎么用多线程  快速快效率  导入数据库
private void button6_Click(object sender, EventArgs e)
        {
            //得到txt文件的数目
            int iCount = listBox1.Items.Count;

            DataTable dt = new DataTable();

            for (int j = 0; j < iCount; j++)
            {
                //取到第一个txt文件
                string sFile = listBox1.Items[j].ToString();

                DateTime dtLast;

                //放进ArrayList中
                ArrayList al = Common.GetFileArray(sFile, out dtLast);
                 
                for (int i = 0; i < al.ToString().Length; i++)
                {
                    //读取第一行的txt文件数据
                    string sTemp = al[i].ToString();
                    //以空格 截取
                    string[] sArr = sTemp.Split(new string[] { "   " }, StringSplitOptions.None);
                    
                    //创建线程  主线程
                    Thread Th = new Thread(delegate()
                        {
                            CountFrom(sArr);
                        });
                    
                    //启动线程
                    Th.Start();


                    CountFrom(sArr);
                }
                this.label3.Text = "导入错误数据 " + indexConut + " 条";
            }
        }
        //错误记录
        static int indexConut = 1;
        static void CountFrom(string[] sArr)
        {

            string sql = string.Format("INSERT INTO [CLRAS].[dbo].[T_LIGHTNING]([OCCURTIME],[JINDU],[WEIDU] ,[INTENSITY],[GRADIENT]  ,[CHARGE]" +
                                        ",[ENERGY],[OFFSET],[LOCATEMODE],[OCCURNS] ,[TODAYID],[PROVINCE],[COUNTY],[CITY],[GRIDKEY])" +
                                        "VALUES('{0}',{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14})",
                                        sArr[0], sArr[1], sArr[2], sArr[3], sArr[4], sArr[5], 0, 0, 0, 0, 0, 0, sArr[7], sArr[8], sArr[9]);
            try
            {
                Database db = DatabaseFactory.CreateDatabase();
                SqlCommand cmd = new SqlCommand(sql);
                if (db.ExecuteNonQuery(cmd) > 0)
                {

                }
            }
            catch (Exception ex)
            {
                
                indexConut++;
            }
        } 多线程 --------------------编程问答-------------------- 如果文件名是顺序号的,那么就开几个线程,每个线程负责指定数字范围的文件,比如线程1负责1-1000,线程2负责1001-2000,至于线程怎么用,Thread类,去查msdn或google --------------------编程问答-------------------- 建议用包的来导入数据。 --------------------编程问答--------------------
ThreadPool --------------------编程问答-------------------- 同意楼上,ThreadPool --------------------编程问答-------------------- 瓶颈在插入方式和数据库,就算是多线程,我估计最多提高一倍的速度。

使用数据库后台的工具批量导入,我想能有10倍的效率。

--------------------编程问答-------------------- 我觉得瓶颈不在是不是多线程,而是 数据库频繁的读写。
我觉得不如写一个存储过程,传一个参数进来,参数是一个字符串,这个字符串是多行记录值的拼接,比如:

item1: S001, Jack, 23, 男
item2: S002, Mary, 24, 女

那么你传入的存储过程参数为:“S001,Jack,23,男;S002,Mary,24,女”,存储过程里面对字符串进行分割,然后该转型的转型,该 substring 的 substring。至于一次传进去的几个记录完全取决于你。 --------------------编程问答-------------------- google bluk copy --------------------编程问答-------------------- 来看看学习一下 --------------------编程问答--------------------
引用 5 楼 rtdb 的回复:
瓶颈在插入方式和数据库,就算是多线程,我估计最多提高一倍的速度。

使用数据库后台的工具批量导入,我想能有10倍的效率。

导入的文件是TXT文件 怎么用数据库后台的工具批量导入? --------------------编程问答--------------------
引用 9 楼 Mychenxinyu 的回复:
Quote: 引用 5 楼 rtdb 的回复:

瓶颈在插入方式和数据库,就算是多线程,我估计最多提高一倍的速度。

使用数据库后台的工具批量导入,我想能有10倍的效率。

导入的文件是TXT文件 怎么用数据库后台的工具批量导入?


SQL数据库导出的模版就是txt 导入的也是  --------------------编程问答--------------------
引用 10 楼 qq873113580 的回复:
Quote: 引用 9 楼 Mychenxinyu 的回复:

Quote: 引用 5 楼 rtdb 的回复:

瓶颈在插入方式和数据库,就算是多线程,我估计最多提高一倍的速度。

使用数据库后台的工具批量导入,我想能有10倍的效率。

导入的文件是TXT文件 怎么用数据库后台的工具批量导入?


SQL数据库导出的模版就是txt 导入的也是 

求图求真相 --------------------编程问答-------------------- 线程池是王道.线程不行的 那么多文件 你电脑也不能开那么多线程啊. --------------------编程问答-------------------- 你首先得知道慢在哪,再来谈解决之道。 --------------------编程问答--------------------
引用 13 楼 yuwenge 的回复:
你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢 --------------------编程问答--------------------
引用 12 楼 diaodiaop 的回复:
线程池是王道.线程不行的 那么多文件 你电脑也不能开那么多线程啊.

我想NEW 5个线程 每个线程处理一个文件  处理完  在处理下一个文件
  理论上会快五倍 不知道行不行 --------------------编程问答--------------------
引用 14 楼 Mychenxinyu 的回复:
Quote: 引用 13 楼 yuwenge 的回复:

你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢

你这完全说得外行话么,问直接点,哪一段代码最慢? --------------------编程问答--------------------
引用 16 楼 yuwenge 的回复:
Quote: 引用 14 楼 Mychenxinyu 的回复:

Quote: 引用 13 楼 yuwenge 的回复:

你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢

你这完全说得外行话么,问直接点,哪一段代码最慢?

一千多万条数据  我觉得哪都慢
 我就是希望他能同时处理多条数据 --------------------编程问答--------------------
引用 17 楼 Mychenxinyu 的回复:
Quote: 引用 16 楼 yuwenge 的回复:

Quote: 引用 14 楼 Mychenxinyu 的回复:

Quote: 引用 13 楼 yuwenge 的回复:

你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢

你这完全说得外行话么,问直接点,哪一段代码最慢?

一千多万条数据  我觉得哪都慢
 我就是希望他能同时处理多条数据

你这只是定性的发现了问题,而没有定量的分析问题,又如何解决问题?

1kw数据,从磁盘读取,到插入数据库,总不是一行代码就干完的,你不先找出瓶颈在哪,不理解瓶颈出现的原因。,又怎么突破瓶颈?

从txt直接导入数据的速度是很快的,因为做数据库导入功能的人认真的分析了哪里慢,解决的导致慢的问题。要么你就直接用他的导入功能,要不然,你就得自己写类似的导入功能。 --------------------编程问答--------------------
引用 18 楼 yuwenge 的回复:
Quote: 引用 17 楼 Mychenxinyu 的回复:

Quote: 引用 16 楼 yuwenge 的回复:

Quote: 引用 14 楼 Mychenxinyu 的回复:

Quote: 引用 13 楼 yuwenge 的回复:

你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢

你这完全说得外行话么,问直接点,哪一段代码最慢?

一千多万条数据  我觉得哪都慢
 我就是希望他能同时处理多条数据

你这只是定性的发现了问题,而没有定量的分析问题,又如何解决问题?

1kw数据,从磁盘读取,到插入数据库,总不是一行代码就干完的,你不先找出瓶颈在哪,不理解瓶颈出现的原因。,又怎么突破瓶颈?

从txt直接导入数据的速度是很快的,因为做数据库导入功能的人认真的分析了哪里慢,解决的导致慢的问题。要么你就直接用他的导入功能,要不然,你就得自己写类似的导入功能。

他自己有自带的导入数据功能?
但是我的数据还要处理才导入数据 --------------------编程问答--------------------
引用 19 楼 Mychenxinyu 的回复:
Quote: 引用 18 楼 yuwenge 的回复:

Quote: 引用 17 楼 Mychenxinyu 的回复:

Quote: 引用 16 楼 yuwenge 的回复:

Quote: 引用 14 楼 Mychenxinyu 的回复:

Quote: 引用 13 楼 yuwenge 的回复:

你首先得知道慢在哪,再来谈解决之道。

数据太多、导入数据库会卡住 而且很慢

你这完全说得外行话么,问直接点,哪一段代码最慢?

一千多万条数据  我觉得哪都慢
 我就是希望他能同时处理多条数据

你这只是定性的发现了问题,而没有定量的分析问题,又如何解决问题?

1kw数据,从磁盘读取,到插入数据库,总不是一行代码就干完的,你不先找出瓶颈在哪,不理解瓶颈出现的原因。,又怎么突破瓶颈?

从txt直接导入数据的速度是很快的,因为做数据库导入功能的人认真的分析了哪里慢,解决的导致慢的问题。要么你就直接用他的导入功能,要不然,你就得自己写类似的导入功能。

他自己有自带的导入数据功能?
但是我的数据还要处理才导入数据

听你这么说 我豁然开朗了 谢谢 --------------------编程问答--------------------
引用 11 楼 Mychenxinyu 的回复:
Quote: 引用 10 楼 qq873113580 的回复:

Quote: 引用 9 楼 Mychenxinyu 的回复:

Quote: 引用 5 楼 rtdb 的回复:

瓶颈在插入方式和数据库,就算是多线程,我估计最多提高一倍的速度。

使用数据库后台的工具批量导入,我想能有10倍的效率。

导入的文件是TXT文件 怎么用数据库后台的工具批量导入?


SQL数据库导出的模版就是txt 导入的也是 

求图求真相



度娘一下 SQL数据库导入导出数据图解教程  真相就有了 --------------------编程问答-------------------- 先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。 --------------------编程问答-------------------- 用异步吧,比多线程要顺畅很多。

private delegate YourThink someThink();

private YourThink GetSomeThink()
        {
          //通过代码取你需要的数据
            return (yourThink);
        }

private void button1_Click(object sender, EventArgs e)
{
//点击执行异步操作
someThink GGID = GetSomeThink;
IAsyncResult iAsyncResult = GGID.BeginInvoke(DoThinkCompleted, GGID);
}

//异步回调函数
private void DoThinkCompleted(IAsyncResult asyncResult)
{
  //这里处理完你的事情


    //然后继续异步去执行
   someThink GGID = GetSomeThink;
   IAsyncResult iAsyncResult = GGID.BeginInvoke(DoThinkCompleted, GGID);

} --------------------编程问答-------------------- 打开MP选项,多核优势放出来 --------------------编程问答--------------------
引用 24 楼 e_board 的回复:
打开MP选项,多核优势放出来

MP是什么?
--------------------编程问答--------------------
引用 23 楼 sv_hot 的回复:
用异步吧,比多线程要顺畅很多。

private delegate YourThink someThink();

private YourThink GetSomeThink()
        {
          //通过代码取你需要的数据
            return (yourThink);
        }

private void button1_Click(object sender, EventArgs e)
{
//点击执行异步操作
someThink GGID = GetSomeThink;
IAsyncResult iAsyncResult = GGID.BeginInvoke(DoThinkCompleted, GGID);
}

//异步回调函数
private void DoThinkCompleted(IAsyncResult asyncResult)
{
  //这里处理完你的事情


    //然后继续异步去执行
   someThink GGID = GetSomeThink;
   IAsyncResult iAsyncResult = GGID.BeginInvoke(DoThinkCompleted, GGID);

}

不懂、没接触过 弄教下我? --------------------编程问答--------------------
引用 22 楼 zl373946618289 的回复:
先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。

这个怎么用?会快些? --------------------编程问答--------------------
引用 27 楼 Mychenxinyu 的回复:
Quote: 引用 22 楼 zl373946618289 的回复:

先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。

这个怎么用?会快些?

怎么用?google一下很简单的,
至于速度吗,是官方提供的一个操作类主要用于一次性插入大量数据用的,
之前用过50W数据一本2,3秒钟就入库了。 --------------------编程问答--------------------
引用 28 楼 zl373946618289 的回复:
Quote: 引用 27 楼 Mychenxinyu 的回复:

Quote: 引用 22 楼 zl373946618289 的回复:

先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。

这个怎么用?会快些?

怎么用?google一下很简单的,
至于速度吗,是官方提供的一个操作类主要用于一次性插入大量数据用的,
之前用过50W数据一本2,3秒钟就入库了。

这个听起来貌似很牛的样子。。。 --------------------编程问答--------------------
引用 29 楼 zhangyi2013 的回复:
Quote: 引用 28 楼 zl373946618289 的回复:

Quote: 引用 27 楼 Mychenxinyu 的回复:

Quote: 引用 22 楼 zl373946618289 的回复:

先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。

这个怎么用?会快些?

怎么用?google一下很简单的,
至于速度吗,是官方提供的一个操作类主要用于一次性插入大量数据用的,
之前用过50W数据一本2,3秒钟就入库了。

这个听起来貌似很牛的样子。。。

2、3s 是挺快 --------------------编程问答--------------------
引用 29 楼 zhangyi2013 的回复:
Quote: 引用 28 楼 zl373946618289 的回复:

Quote: 引用 27 楼 Mychenxinyu 的回复:

Quote: 引用 22 楼 zl373946618289 的回复:

先把数据读取到内存中,然后用System.Data.SqlClient.SqlBulkCopy这个函数进行写入数据库。

这个怎么用?会快些?

怎么用?google一下很简单的,
至于速度吗,是官方提供的一个操作类主要用于一次性插入大量数据用的,
之前用过50W数据一本2,3秒钟就入库了。

这个听起来貌似很牛的样子。。。

我开始是打算用  但是我还要对数据处理不好用
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,