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

有什么方法比 DataTable.Select()更高效

我现有10万条数据在DataTable中,要快速找出符合条件的那条数据,使用DataTable.Select()方法需要耗时100多毫秒,有没有什么方法能比Select()方法更高效的,最好能把时间减少到几毫秒到10几毫秒。求各位大虾帮帮忙。 --------------------编程问答-------------------- 使用linq试试 --------------------编程问答-------------------- 先给你的DataTable排序,然后再Select。。也许能提高一点效率。。
--------------------编程问答-------------------- 感觉没什么更好的办法,设计的时候就不该把那么多数据都放Datatable中。。
像这种情况,我们都是用排序的办法,把需要的数据排序到最前面或者尽量靠近最前面,这样速度相对能提高不少。。你可以试试。。 --------------------编程问答-------------------- 如果定义了主键的话,用DataTable.Rows.Find 应该能提高速度

private void FindInPrimaryKeyColumn(DataTable table, 
    long pkValue)
{
    // Find the number pkValue in the primary key 
    // column of the table.
    DataRow foundRow = table.Rows.Find(pkValue);

    // Print the value of column 1 of the found row.
    if(foundRow != null)
        Console.WriteLine(foundRow[1]);
}
--------------------编程问答--------------------
引用 3 楼 menglingjun 的回复:
感觉没什么更好的办法,设计的时候就不该把那么多数据都放Datatable中。。
像这种情况,我们都是用排序的办法,把需要的数据排序到最前面或者尽量靠近最前面,这样速度相对能提高不少。。你可以试试。。
关键是不确定哪些是需要的,里面十万多条数据都可能需要,之所以放在DataTable中,是为了不用老是连数据库查,那样速度更慢,因为每隔10来毫秒就会进入方法一次 --------------------编程问答--------------------
引用 1 楼 shiyuyao1987 的回复:
使用linq试试
用Linq 更慢 --------------------编程问答--------------------
引用 4 楼 fangxinggood 的回复:
如果定义了主键的话,用DataTable.Rows.Find 应该能提高速度


C# code
private void FindInPrimaryKeyColumn(DataTable table, 
    long pkValue)
{
    // Find the number pkValue in the primary key 
    // column of t……
现在我的查询条件不是一个,有好几个条件,更加不是主键 --------------------编程问答-------------------- 用 foreach 自己 写代码 滤 试试 --------------------编程问答-------------------- datatable.defaultview.rowfilter=""//检索的条件 --------------------编程问答--------------------
引用楼主 ll891230 的回复:
我现有10万条数据在DataTable中,要快速找出符合条件的那条数据,使用DataTable.Select()方法需要耗时100多毫秒,有没有什么方法能比Select()方法更高效的,最好能把时间减少到几毫秒到10几毫秒。求各位大虾帮帮忙。

我乱想的,错了别怪我!
虽然你是需要用Select()找到你符合条件的那条数据,但是你的DataTable数据显示在窗口上能显示10万条?我想即使绑定到dataGridView上面也就显示几十条吧。所以解决方法就是一旦你在Select()的过程中显示了能够填充那几十条记录的时候你就立刻显示,剩下的在你显示之后处理也不迟 --------------------编程问答-------------------- Select方法已经很快了,比较你数据多。楼上根本不知道Select方法是什么,在那胡说八道。 --------------------编程问答--------------------
引用 11 楼 qldsrx 的回复:
Select方法已经很快了,比较你数据多。楼上根本不知道Select方法是什么,在那胡说八道。


别理他  哈哈!


话说我基本不用DATATABLE这种东西,通常都是LINQ。。。100多毫秒的话我就不会关心效率问题了!没研究过。。。100秒我才关心! --------------------编程问答--------------------
引用 11 楼 qldsrx 的回复:
Select方法已经很快了,比较你数据多。楼上根本不知道Select方法是什么,在那胡说八道。

是吗?我这个人就是比较喜欢乱想啊,哈哈 --------------------编程问答--------------------
引用 12 楼 cfvgodot 的回复:
引用 11 楼 qldsrx 的回复:

Select方法已经很快了,比较你数据多。楼上根本不知道Select方法是什么,在那胡说八道。


别理他  哈哈!


话说我基本不用DATATABLE这种东西,通常都是LINQ。。。100多毫秒的话我就不会关心效率问题了!没研究过。。。100秒我才关心!

能不能请教下,我的方法为什么不行呢? --------------------编程问答--------------------
引用 14 楼 yunhaic 的回复:
能不能请教下,我的方法为什么不行呢?


首先,楼主是说SELECT()的效率问题,跟绑定无关。。。这是查询。。

其次,执行SELECT之后你BREAK掉它的线程我看看你怎么实现的! --------------------编程问答--------------------
引用 15 楼 cfvgodot 的回复:
引用 14 楼 yunhaic 的回复:

能不能请教下,我的方法为什么不行呢?


首先,楼主是说SELECT()的效率问题,跟绑定无关。。。这是查询。。

其次,执行SELECT之后你BREAK掉它的线程我看看你怎么实现的!

是啊,我的重点也不是绑定OK?人总要一点想象力吧,不能总是抱着这个技术那个技术。

你用select()以后,你打算怎么用呢?对不对,你的10万条数据给谁看?难道你筛选数据就搞着玩?你自然要面向用户啊,select()以后再break,我可以从break的地方获取相应的row[]的唯一标识,下次如果有需要再从标识以后select()或者说再做了基本的任务的同时我继续同步的去select()剩下的数据?难道不行?不合理? --------------------编程问答--------------------
引用 15 楼 cfvgodot 的回复:
引用 14 楼 yunhaic 的回复:

能不能请教下,我的方法为什么不行呢?


首先,楼主是说SELECT()的效率问题,跟绑定无关。。。这是查询。。

其次,执行SELECT之后你BREAK掉它的线程我看看你怎么实现的!

难道查询过以后你叫用户去你的查询分析器去看记录? --------------------编程问答-------------------- 压根就没必要去一次筛选10万条记录,搞数据不是比记录多,是有没必要的问题 --------------------编程问答--------------------
引用 18 楼 yunhaic 的回复:
压根就没必要去一次筛选10万条记录,搞数据不是比记录多,是有没必要的问题


恩。。。无图无真相。。。。你弄个BREAK的代码我看看先!上图上图!!! --------------------编程问答--------------------
引用 19 楼 cfvgodot 的回复:
引用 18 楼 yunhaic 的回复:

压根就没必要去一次筛选10万条记录,搞数据不是比记录多,是有没必要的问题


恩。。。无图无真相。。。。你弄个BREAK的代码我看看先!上图上图!!!

你这样提问与想问题,就能体现出你解决问题的能力欠佳 --------------------编程问答--------------------
引用 1 楼 shiyuyao1987 的回复:
使用linq试试


不要欺骗自己 --------------------编程问答-------------------- --------------------编程问答-------------------- 对要执行 select 的过滤字段 进行自建索引, 用什么索引, 看你想象力了.
不要使用 select,
RowFilter 更是扯蛋, 尤其数据已经绑定到界面的情况下,
各位看官可以尝试一下那个效率有多低.
--------------------编程问答--------------------
引用 20 楼 yunhaic 的回复:
引用 19 楼 cfvgodot 的回复:

引用 18 楼 yunhaic 的回复:

压根就没必要去一次筛选10万条记录,搞数据不是比记录多,是有没必要的问题


恩。。。无图无真相。。。。你弄个BREAK的代码我看看先!上图上图!!!

你这样提问与想问题,就能体现出你解决问题的能力欠佳



。。。。不跟你说了!!


这都神马跟神马,楼主根本没假定多少条记录的查询结果,如果是10W的用户信息被CACHE起来呢?需要精确定位到用户信息时的效率问题,你什么多行又记录的,人家就是问,DATATABLE的SELECT()方法的效率问题,能不能用别的查询方法替代,或者说先对DATATABLE建索引这样的方式可以提高查询效率。。。你都什么跟什么呀!你看楼主理你么。。。


额。。。想到这里,突然想到SQL分区的概念,楼主能否按照DATATABLE的某些排序方式、索引或者行号什么的拆分,然后用多线程去查? --------------------编程问答--------------------
引用 4 楼 fangxinggood 的回复:
如果定义了主键的话,用DataTable.Rows.Find 应该能提高速度


C# code
private void FindInPrimaryKeyColumn(DataTable table, 
    long pkValue)
{
    // Find the number pkValue in the primary key 
    // column of t……


+1

数据量大的时候当然还是充分利用主键了

if (dt.PrimaryKey == null || dt.PrimaryKey.Length == 0)
{
     dt.PrimaryKey = new DataColumn[] { dt.Columns["PK_ColunmeName"] };
} --------------------编程问答-------------------- 还是有办法的

把数据排下序,然后再自己写查找算法

DataTable.Select 是把所有的数据遍历一遍,所以会慢 --------------------编程问答--------------------
引用 26 楼 huwei001982 的回复:
还是有办法的

把数据排下序,然后再自己写查找算法

DataTable.Select 是把所有的数据遍历一遍,所以会慢
谢谢,我去试试 --------------------编程问答--------------------
引用 6 楼 ll891230 的回复:
引用 1 楼 shiyuyao1987 的回复:
使用linq试试
用Linq 更慢

用LINQ转来转去的,肯定更慢 --------------------编程问答--------------------
引用楼主 ll891230 的回复:
我现有10万条数据在DataTable中

首先你这样做 你就错了
同情你的内存 --------------------编程问答--------------------
引用 29 楼 q107770540 的回复:
引用楼主 ll891230 的回复:
我现有10万条数据在DataTable中

首先你这样做 你就错了
同情你的内存
那你给我个方案,如果不放在内存,我该怎么做,它每隔几毫秒就有几十条数据过来,总之不能不断从数据库查,一连一关都要耗0-15毫秒,这样效率更低。 --------------------编程问答--------------------
引用 29 楼 q107770540 的回复:
引用楼主 ll891230 的回复:
我现有10万条数据在DataTable中

首先你这样做 你就错了
同情你的内存

如果不放内存中,又该放哪里呢?吧需要的数据远程查询吗?求问 --------------------编程问答-------------------- --------------------编程问答-------------------- 你这样子是不行的,数据增量那么快,你查出来放内存里也不是办法,万一新来的数据你也需要呢?我觉得你需要用的数据应该不多吧,而且你处理也不是时时的吧?隔一段时间取一下需要的数据就行了。一般超过一万的数据我就不会全部取到内存里了,个人建议。 --------------------编程问答--------------------
引用 33 楼 mr_graceless 的回复:
你这样子是不行的,数据增量那么快,你查出来放内存里也不是办法,万一新来的数据你也需要呢?我觉得你需要用的数据应该不多吧,而且你处理也不是时时的吧?隔一段时间取一下需要的数据就行了。一般超过一万的数据我就不会全部取到内存里了,个人建议。
这个也是个问题,但是不放在内存想不出更好的方法。目前我是这么做的,程序一启动就有一个线程每隔几分钟去查询一次数据库(具体几分钟由配置文件配置)。 --------------------编程问答--------------------
引用 34 楼 ll891230 的回复:
引用 33 楼 mr_graceless 的回复:
你这样子是不行的,数据增量那么快,你查出来放内存里也不是办法,万一新来的数据你也需要呢?我觉得你需要用的数据应该不多吧,而且你处理也不是时时的吧?隔一段时间取一下需要的数据就行了。一般超过一万的数据我就不会全部取到内存里了,个人建议。
这个也是个问题,但是不放在内存想不出更好的方法。目前我是这么做的,程序一启动就有一个线程每隔几分钟去查询一次……
放在DataTable里的数据都是需要的,都可能会用到 --------------------编程问答-------------------- 想快就别把10万条数据都放到datatable里。 --------------------编程问答-------------------- 我想说明的是,其实不应该怕什么数据库连接花时间。因为数据库连接,net有个方式是连接池,不会出现重复连接的情况。即使没有你也可以自己搞个全局连接对象。

还是放数据库中可取。因为数据库的查询效率才是最高。 --------------------编程问答--------------------
引用 20 楼 yunhaic 的回复:
引用 19 楼 cfvgodot 的回复:

引用 18 楼 yunhaic 的回复:

压根就没必要去一次筛选10万条记录,搞数据不是比记录多,是有没必要的问题


恩。。。无图无真相。。。。你弄个BREAK的代码我看看先!上图上图!!!

你这样提问与想问题,就能体现出你解决问题的能力欠佳


好吧 一直是你的回答
感觉你很牛X  其实像个**
好吧   不说了    星爷们都说的很正确 --------------------编程问答--------------------
引用 37 楼 wqzone 的回复:
我想说明的是,其实不应该怕什么数据库连接花时间。因为数据库连接,net有个方式是连接池,不会出现重复连接的情况。即使没有你也可以自己搞个全局连接对象。

还是放数据库中可取。因为数据库的查询效率才是最高。
之前就是用查询的方法,后来发现效率太低,才改用存在内存里的 --------------------编程问答--------------------
引用 39 楼 ll891230 的回复:
引用 37 楼 wqzone 的回复:
我想说明的是,其实不应该怕什么数据库连接花时间。因为数据库连接,net有个方式是连接池,不会出现重复连接的情况。即使没有你也可以自己搞个全局连接对象。

还是放数据库中可取。因为数据库的查询效率才是最高。
之前就是用查询的方法,后来发现效率太低,才改用存在内存里的


个人感觉,还是应该保存到DB里,并不是所有记录一直都在用不是?
一个线程插入DB,一个线程查。。。
插入不过几条数据,数据库再加入索引,就算每秒查也不会慢。
通常100W级别的数据,带索引检索不过是ms级别的响应。
内存是有限的,如果是一直运行7x24H,再大内存也不够。

可能你觉得每次查询慢,是因为没有DB连接池,每次new connection都特别慢,
还是查询的代码哪块没整好。
--------------------编程问答-------------------- 如果可以,不适用DataTable查询可以吗?我的意思是假如查询条件比较固定,可以转化成Dictionary<string,DataRow> ,这样查找会快很多吧,就是做个主键和DataRow的映射关系。
如果主键有重复,就做个List。 不知可行不 --------------------编程问答-------------------- 你可以拿两次出来查询 --------------------编程问答-------------------- 为什么把十万条数据放在DataTable中,多占内存啊! --------------------编程问答-------------------- LZ 这个问题应该放到 db 端去考虑了。

而不是在应用或者服务端 使用程序处理。

至于 LZ 说 使用从数据库读取的办法  慢。 参照下 39 40 楼的说法看看。
10w 笔的数据,查询、检索如果在db端优化处理的好的话,应该比前端程式要好些的。 --------------------编程问答-------------------- 先对10万条在数据库中作个二次查询,10万条在datatable,太委屈他了 --------------------编程问答-------------------- 10万条(而且是弱类型的复杂结构类型)记录放在内存里,遍历过滤一次都不止10毫秒。

应该使用数据库索引来查找。 --------------------编程问答-------------------- 给数据库表建立索引,用索引来查找。 --------------------编程问答-------------------- 建议一次只拿一部分 别一次全拿出来 --------------------编程问答-------------------- 如果说10完条放数据库中查找有性能问题,那也不可能是连接数据库带来的 --------------------编程问答-------------------- 究竟那种方法好呀,关注! --------------------编程问答-------------------- 个人觉得这个问题应该发给微软。~ --------------------编程问答-------------------- 个人不发言  但是一次性读十万条会崩溃的 --------------------编程问答-------------------- 10条数据放到内存中
o my lady gaga

尽量在SQL中完成把!!!! --------------------编程问答-------------------- 谁说10万条记录不能放在内存里面的?
难道客户要输出10万条记录的报表,你还不给打了?
如果1000个客户同时都需要输出巨量数据呢?
(比如财务/税务等系统,每个会计区间都需要输出实体单据,那种输出量是非常巨大,并且是高并发的)

无论DBMS还是我们自己开发数据访问服务器(DAS),
(很多人乐此不疲的搞什么ORM,却不晓得设计一个真正OO的数据访问服务器)
都要充分利用内存来提高查询效率和访问速度,

那种只依靠DBMS或者APP访问数据的做法都是不可取(低效率)的
简单描述策略就是:
数据库完成复杂查询,分批把数据送达APP-DAL或者DAS,然后再由DA分批送到客户端
在一个查询周期中,如果客户第二次调阅某页数据,就不会再劳驾DBMS和占用LINK了,
而客户端的开发大大简化,那看上去就是一遍遍不厌其烦的、单调的访问DAS --------------------编程问答-------------------- 数据库10W条1-2秒也搞不出来吧? --------------------编程问答--------------------
引用 54 楼 microtry 的回复:
谁说10万条记录不能放在内存里面的?
难道客户要输出10万条记录的报表,你还不给打了?
如果1000个客户同时都需要输出巨量数据呢?
(比如财务/税务等系统,每个会计区间都需要输出实体单据,那种输出量是非常巨大,并且是高并发的)

无论DBMS还是我们自己开发数据访问服务器(DAS),
(很多人乐此不疲的搞什么ORM,却不晓得设计一个真正OO的数据访问服务器)
都要充分利用内存来提高……


好像你理解错了,lz的意思是把所有数据都放到内存,怎么来优化查询(lz连第一都不想从数据库中获取)。
而不是搞什么第一次数据查询,然后缓存(当然这种模式可以考虑)。 --------------------编程问答-------------------- 建议,第一次还是走数据库中查询。

数据库中肯定要建立索引(非聚集,根据常用的查询条件) --------------------编程问答-------------------- 期待高手解决 --------------------编程问答-------------------- --------------------编程问答-------------------- 像这么多的数据,在数据库中查询比较应该来得更快吧
另外,我一般用datatable 只是缓存一下用户的信息,在登录时,不用经常去读数据库。 --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主的问题最好不要使用DataTable,它是弱类型的,进行查找的时候自然比较慢。
如果楼主要查找某一个字段,或者说列,将这列的数据单独导出到一个SortList中,然后查找,或者你自己搞二分查找,这样效率能够很高。 --------------------编程问答-------------------- 我原来也碰到过了,不过后来把数据放在数据库里来处理 ,这样更快啊 ,  在内存中处理这么多数据,个人感觉划部来~~~ --------------------编程问答-------------------- 这个问题是扯淡,一下子查出来10w条数据效率能好嘛 

在读数据的时候想办法过滤掉无用的数据,

我不相信要一次性的要看10W条数据



--------------------编程问答-------------------- 干嘛一下子读出来? 分批次读出来需要的记录后放在不同的datatable中 以后要得话 去那个datatable中拿应该更合理些 --------------------编程问答-------------------- 条件是否简单?简单的话做哈希吧,嵌套几个dictionary --------------------编程问答-------------------- 期待高手 --------------------编程问答-------------------- 在10W条出来之前先加更多的过滤条件。 --------------------编程问答-------------------- 10万条数据...内存吃得消么..??用datatable估计不是好办法..我觉得应该要与其他结合起来..例如数据库的memory table..datatable的设计初衷应该是对应少量数据吧...(高手不要喷我..只是个人想法..) --------------------编程问答-------------------- 乱说的,楼主参考下:
数据库索引去硬盘或者数据库的缓存查找。

程序也可以试试写算法给DataTable建索引啊。
按大小比较的就排序,按键值查询的就把相同键值的DataRow集合放到一个字典里去
比如Dictionary<String Key,List<DataRow>>之类的。
多个查找条件就弄几个字典。反正只是对DataRow的引用
还可以查查数据库索引的算法。



--------------------编程问答-------------------- 请看如下测试代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = GetTable();
            Console.WriteLine("当前表总数量量=" + dt.Rows.Count);
            IList<Demo> lists = GetLists();

            string sql = "sName like '%999%' and sCity like '%第9%'";

            while (true)
            {
                Console.WriteLine("自行循环查询耗时=" + searchByForeach(lists) + "毫秒");
                Console.WriteLine("");
                Console.WriteLine("以Linq查询耗时=" + searchByLinq(lists) + "毫秒");
                Console.WriteLine("");
                Console.WriteLine("按select查询耗时=" + searchBySelect(dt, sql) + "毫秒");
                Console.WriteLine("");
                Console.WriteLine("按Filter查询耗时=" + searchByFilter(dt, sql) + "毫秒");
                Console.WriteLine("");

                string s = Console.ReadLine();
                if (s == "exit")
                {
                    return;
                }
            }
        }

        private static int searchBySelect(DataTable dt,string sql)
        {
            DateTime start = DateTime.Now;
            DataRow[] drs = dt.Select(sql);
            Console.WriteLine("求取的数据数量=" + drs.Length);
            //Console.WriteLine(start.ToString("mm:ss fff") + DateTime.Now.ToString("mm:ss fff"));
            TimeSpan ts = DateTime.Now - start;

            return ts.Milliseconds;
        }

        private static int searchByFilter(DataTable dt, string sql)
        {
            DateTime start = DateTime.Now;
            dt.DefaultView.RowFilter = sql;
            int count = dt.DefaultView.Count;
            Console.WriteLine("求取的数据数量=" + count);
            TimeSpan ts = DateTime.Now - start;

            return ts.Milliseconds;
        }

        private static int searchByLinq(IList<Demo> lists)
        {
            DateTime start = DateTime.Now;
  
            var values = from obj in lists
                         where obj.Name.Contains("999")
                         && obj.City.Contains("第9")
                         select obj;
            int count = values.Count();

            Console.WriteLine("求取的数据数量=" + count);
            TimeSpan ts = DateTime.Now - start;

            return ts.Milliseconds;
        }

        private static int searchByForeach(IList<Demo> lists)
        {
            DateTime start = DateTime.Now;

            int count = 0;
            foreach (Demo info in lists)
            {
                if (info.Name.Contains("999") && info.City.Contains("第9"))
                {
                    count++;
                }
            }

            Console.WriteLine("求取的数据数量=" + count);
            TimeSpan ts = DateTime.Now - start;

            return ts.Milliseconds;
        }


        private static DataTable GetTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("sName", typeof(string));
            dt.Columns.Add("sCity", typeof(string));
            dt.Columns.Add("sId");
            

            for (int i = 0; i < 100000; i++)
            {
                DataRow dr = dt.NewRow();
                dr["sId"] = i.ToString();
                dr["sName"] = "标准数据_" + i;
                dr["sCity"] = "居住在第" + i + "城市";

                dt.Rows.Add(dr);
            }

            return dt;
        }

        private static IList<Demo> GetLists()
        {
            IList<Demo> lists = new List<Demo>();
            for (int i = 0; i < 100000; i++)
            {
                Demo info = new Demo();
                info.Id = i.ToString();
                info.Name = "标准数据_" + i;
                info.City = "居住在第" + i + "城市";

                lists.Add(info);
            }

            return lists;
        }

        public class Demo
        {
            public string Id = string.Empty;
            public string Name = string.Empty;
            public string City = string.Empty;
        }
    }
}
--------------------编程问答-------------------- 应该还是把数据插入到IList里面,然后使用linq查询来得快.
事实上,数据存储在内存中,按照现在的服务器的运算速度来看,对之查询速度非常之快,十几万条太小菜了.
唯一有问题的是,内存的消耗.只不过如果有这种业务需求的时候,再相对现在内存的价格以及操作系统64位的支持,这么一小点小小的内存支出完全不成问题.

而且,在内存中存储十几万条数据似乎也不是很消耗内存的事情(取决于存储什么东西,按楼主的情况来看,恐怕是存储一些数字而已,占用的内存估计不多) --------------------编程问答-------------------- 放到队列里 --------------------编程问答-------------------- DataTable中要建立主键 --------------------编程问答-------------------- 10万多条数据放到Table中不会占用很大内存吗?估计占用100M以上了吧? --------------------编程问答-------------------- 做一次后,缓存。 --------------------编程问答-------------------- 如果是我,会对Row用Dictionary建立索引,查找Dictionary速度比select快多了, --------------------编程问答-------------------- 100万笔数据
DataTable
查询只需10毫秒
条件是 往DataTable填充数据之后 要执行一次select(第一次速度 有点慢)
以后 查询速度会很快 --------------------编程问答-------------------- 我原先也碰到过这种情况,
行业:环保监测
情景回放:
存在大量的客户端(约300-400个),都使用tcp连接连接到服务器,然后客户端平均约23秒左右就发送一条文本数(该数据包含大约30-60条不等的真是数据)据到服务器(就是平均1/20秒服务器就收到一个数据),服务器收到数据对数据的合格性进行校验,更新内存中的数据显示异常数据的信息及对应客户端的信息,并写入到数据库中。
其中因为需要检验数据的合格性,就等于约在300*40*20【客户*客户端的监测设备数量*监测因子】寻找对应的数据,然后调用内存中的数据对传入数据进行校验,判断出异常后还有进行异常显示,最后还要联同校验结果写入数据库
在如此大量的数据写入动作中,如果每次收到数据然后都去读数据库,显然是不现实的,所以都是在程序运行的初期就把设定的校验值数据读到内存中去,然后数据库只进行数据写入动作。
处理方法:
当时我的处理过程是这样的
1、对于tcp连接选择多线程处理(当然的事情),但我的选择方式有点不同,我选择的是一个线程负责几个tcp连接。
2、对校验数据进行多次读取,并加入复合主键(根据传入的数据)
就是20w行数据按照客户端的编号规则分成若干个(我选择的50个),然后在建立一个客户索引表(只有几个字段:客户端编号,内存校验数据datatable名称,真实存放表名称),然后把这些表都添加到dataset中
3、在把这个dataset复制到线程中,就是每个线程都有一个这个dataset的副本供线程本身使用
4、当有数据传入时,先查找客户端编号,然后再在对应的datatable中查找校验值数据,这样对于异常客户端(没有客户端编号,或客户端编号异常)的数据能达到最快校验的效果
--------------------编程问答-------------------- 数据量大的时候应该可以把DataTable 分割为几个,到优先可能存在的DataTable中去查找,如果找不到再找次优先,然后再。。。 我自己先试一下,明天再回复! --------------------编程问答-------------------- 纯粹来学习的 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 楼主这要求也太高了,100毫秒,眨个眼的功夫,还嫌慢啊,那得让CPU和内存加速10倍。 --------------------编程问答-------------------- 设计有问题  10W数据放在内存里? 难道没分页么? 在说了  就算你有条件

我从新查询数据库+条件 然后在分页 几百万也无压力 

真心不知道 你这10W对你来说有什么意义.难道你把数据装入dt里 就不需要时间了? --------------------编程问答-------------------- http://www.cnblogs.com/AloneSword/articles/801989.html --------------------编程问答-------------------- 可以看看这个帖子
http://www.cnblogs.com/AloneSword/articles/801989.html
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,