社区
C#
帖子详情
有什么方法比 DataTable.Select()更高效
LL891230
2011-03-31 05:05:23
我现有10万条数据在DataTable中,要快速找出符合条件的那条数据,使用DataTable.Select()方法需要耗时100多毫秒,有没有什么方法能比Select()方法更高效的,最好能把时间减少到几毫秒到10几毫秒。求各位大虾帮帮忙。
...全文
6212
86
打赏
收藏
有什么方法比 DataTable.Select()更高效
我现有10万条数据在DataTable中,要快速找出符合条件的那条数据,使用DataTable.Select()方法需要耗时100多毫秒,有没有什么方法能比Select()方法更高效的,最好能把时间减少到几毫秒到10几毫秒。求各位大虾帮帮忙。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
86 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Vampire_D
2013-07-08
打赏
举报
回复
可以看看这个帖子 http://www.cnblogs.com/AloneSword/articles/801989.html
Vampire_D
2013-07-08
打赏
举报
回复
http://www.cnblogs.com/AloneSword/articles/801989.html
by_封爱
版主
2013-06-26
打赏
举报
回复
设计有问题 10W数据放在内存里? 难道没分页么? 在说了 就算你有条件 我从新查询数据库+条件 然后在分页 几百万也无压力 真心不知道 你这10W对你来说有什么意义.难道你把数据装入dt里 就不需要时间了?
tcmakebest
2013-06-26
打赏
举报
回复
楼主这要求也太高了,100毫秒,眨个眼的功夫,还嫌慢啊,那得让CPU和内存加速10倍。
jojoova
2013-06-25
打赏
举报
回复
纯粹来学习的
王思明
2013-06-25
打赏
举报
回复
数据量大的时候应该可以把DataTable 分割为几个,到优先可能存在的DataTable中去查找,如果找不到再找次优先,然后再。。。 我自己先试一下,明天再回复!
nhxq_lzx
2012-03-08
打赏
举报
回复
我原先也碰到过这种情况,
行业:环保监测
情景回放:
存在大量的客户端(约300-400个),都使用tcp连接连接到服务器,然后客户端平均约23秒左右就发送一条文本数(该数据包含大约30-60条不等的真是数据)据到服务器(就是平均1/20秒服务器就收到一个数据),服务器收到数据对数据的合格性进行校验,更新内存中的数据显示异常数据的信息及对应客户端的信息,并写入到数据库中。
其中因为需要检验数据的合格性,就等于约在300*40*20【客户*客户端的监测设备数量*监测因子】寻找对应的数据,然后调用内存中的数据对传入数据进行校验,判断出异常后还有进行异常显示,最后还要联同校验结果写入数据库
在如此大量的数据写入动作中,如果每次收到数据然后都去读数据库,显然是不现实的,所以都是在程序运行的初期就把设定的校验值数据读到内存中去,然后数据库只进行数据写入动作。
处理方法:
当时我的处理过程是这样的
1、对于tcp连接选择多线程处理(当然的事情),但我的选择方式有点不同,我选择的是一个线程负责几个tcp连接。
2、对校验数据进行多次读取,并加入复合主键(根据传入的数据)
就是20w行数据按照客户端的编号规则分成若干个(我选择的50个),然后在建立一个客户索引表(只有几个字段:客户端编号,内存校验数据datatable名称,真实存放表名称),然后把这些表都添加到dataset中
3、在把这个dataset复制到线程中,就是每个线程都有一个这个dataset的副本供线程本身使用
4、当有数据传入时,先查找客户端编号,然后再在对应的datatable中查找校验值数据,这样对于异常客户端(没有客户端编号,或客户端编号异常)的数据能达到最快校验的效果
wwttttww
2011-11-18
打赏
举报
回复
100万笔数据
DataTable
查询只需10毫秒
条件是 往DataTable填充数据之后 要执行一次select(第一次速度 有点慢)
以后 查询速度会很快
stonespace
2011-11-11
打赏
举报
回复
如果是我,会对Row用Dictionary建立索引,查找Dictionary速度比select快多了,
七对
2011-11-11
打赏
举报
回复
做一次后,缓存。
idaydayup
2011-05-11
打赏
举报
回复
10万多条数据放到Table中不会占用很大内存吗?估计占用100M以上了吧?
变成熊猫你就老实了是不
2011-05-11
打赏
举报
回复
DataTable中要建立主键
hchxxzx
2011-04-06
打赏
举报
回复
应该还是把数据插入到IList里面,然后使用linq查询来得快.
事实上,数据存储在内存中,按照现在的服务器的运算速度来看,对之查询速度非常之快,十几万条太小菜了.
唯一有问题的是,内存的消耗.只不过如果有这种业务需求的时候,再相对现在内存的价格以及操作系统64位的支持,这么一小点小小的内存支出完全不成问题.
而且,在内存中存储十几万条数据似乎也不是很消耗内存的事情(取决于存储什么东西,按楼主的情况来看,恐怕是存储一些数字而已,占用的内存估计不多)
hchxxzx
2011-04-06
打赏
举报
回复
请看如下测试代码
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;
}
}
}
请叫我哥
2011-04-06
打赏
举报
回复
放到队列里
csproj
2011-04-05
打赏
举报
回复
乱说的,楼主参考下:
数据库索引去硬盘或者数据库的缓存查找。
程序也可以试试写算法给DataTable建索引啊。
按大小比较的就排序,按键值查询的就把相同键值的DataRow集合放到一个字典里去
比如Dictionary<String Key,List<DataRow>>之类的。
多个查找条件就弄几个字典。反正只是对DataRow的引用
还可以查查数据库索引的算法。
Miaophy
2011-04-05
打赏
举报
回复
10万条数据...内存吃得消么..??用datatable估计不是好办法..我觉得应该要与其他结合起来..例如数据库的memory table..datatable的设计初衷应该是对应少量数据吧...(高手不要喷我..只是个人想法..)
永远专注NET
2011-04-04
打赏
举报
回复
在10W条出来之前先加更多的过滤条件。
xiongxunqin
2011-04-04
打赏
举报
回复
期待高手
codingtaoist
2011-04-04
打赏
举报
回复
条件是否简单?简单的话做哈希吧,嵌套几个dictionary
加载更多回复(61)
c#操作数据库,史上最牛逼的
方法
,你见过这种
方法
吗?
不需要为操作数据库再话费大量的开发时间,节约开发成本,以及
更
高效,
更
快速,
更
方便。 以后将陆续支持
更
多的数据库。 ----------================-----------================--------- SqLamdalf1.0免费版,欢迎...
轻量级数据持久层组件Restful.Data.zip
Restful.Data充分考虑了实体框架的执行效率问题,进行了反复的推敲和论证,尽可能的采用高效的设计方案来提高性能。谁需要Restful.Data? 敢于冒险、追求完美、勇于挑战并极具责任感的程序设计人员。Restful.Data...
AppFramework数据库访问组件_代码生成插件_V1.1.rar
<br>3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList
更
加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; <br>4、 提供了强大的QueryFilter类...
AppFramework_V1.0
<br>3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList
更
加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; <br>4、 提供了强大的QueryFilter类...
AppFramework_V1.0_New
<br>3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList
更
加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; <br>4、 提供了强大的QueryFilter类...
C#
110,566
社区成员
642,567
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章