http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4595|回复: 6

[其他] 关于大数据库的查询遍历问题!

[复制链接]
发表于 2013-11-21 22:21:38 | 显示全部楼层 |阅读模式
     一个数据表有50行X576列。里头有27种数值(字符串型)。怎样较快地遍历数据表并把27种数据存到一个数组里头!
     我用了两个for加一个switch,不过效率不高!【用了20分钟也没处理完,是不是和数值类型有关?!!】谢谢!{:soso_e109:}


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-22 08:07:52 | 显示全部楼层
这个要具体 看表里的数据是怎么存储的,你要提取的数据是什么,你可给个简单的效果图,或者是例子数据库
 楼主| 发表于 2013-11-22 08:51:08 | 显示全部楼层
站长苏飞 发表于 2013-11-22 08:07
这个要具体 看表里的数据是怎么存储的,你要提取的数据是什么,你可给个简单的效果图,或者是例子数据库

21.jpg 以上是数据库列表,0-85列每列5分钟
[C#] 纯文本查看 复制代码
 
public int[] FiveMinutes(string str)
        {
            DB db = new DB();
            int[] Channel = new int[27];
            for (int i = 0; i <= db.reDt(str).Rows.Count - 1; i++)
            {
                for (int j = 0; j < 85; j++)
                {
                    switch (db.reDt(str).Rows[i][j].ToString())
                    {
                        case "CCTV-1": Channel[0]++; break;
                        case "CCTV-2": Channel[1]++; break;
                        case "CCTV-3": Channel[2]++; break;
                        case "CCTV-4": Channel[3]++; break;
                        case "CCTV-5": Channel[4]++; break;
                        case "CCTV-6": Channel[5]++; break;
                        case "CCTV-7": Channel[6]++; break;
                        case "CCTV-8": Channel[7]++; break;
                        case "CCTV-9": Channel[8]++; break;
                        case "浙江卫视": Channel[9]++; break;
                        case "东方卫视": Channel[10]++; break;
                        case "安徽卫视": Channel[11]++; break;
                        case "北京卫视": Channel[12]++; break;
                        case "辽宁卫视": Channel[13]++; break;
                        case "山东卫视": Channel[14]++; break;
                        case "天津卫视": Channel[15]++; break;
                        case "宁夏卫视": Channel[16]++; break;
                        case "河南卫视": Channel[17]++; break;
                        case "湖北卫视": Channel[18]++; break;
                        case "四川卫视": Channel[19]++; break;
                        case "江西卫视": Channel[20]++; break;
                        case "贵州卫视": Channel[21]++; break;
                        case "广东卫视": Channel[22]++; break;
                        case "吉林卫视": Channel[23]++; break;
                        case "河北卫视": Channel[24]++; break;
                        case "重庆卫视": Channel[25]++; break;
                        case "广西卫视": Channel[26]++; break;
                        default: break;
                    }
                }
            }
            for (int k = 0; k < 27; k++)
            {
                Channel[k] = Channel[k] * 5;
            }
            return Channel;
        }



这是代码部分。这85列的遍历花了1分钟30秒。再接下来的240列(每列3分钟)遍历花了5分钟也是按照同样方法。
发表于 2013-11-22 09:00:37 | 显示全部楼层
这个看着不会太慢啊,会不会是因为你查的数据多,数据库反映慢啊,内存执行应该是很快的,应该也没有我少数据吧,我建议你直接在数据库做操作,再加上索引这样会快很多

这个你如果在数据可以直接分组的吧,直接安CCTV-1这样的节目分类,最好是有这个名称的不ID进行分组,这样直接就出来结果了。只需要统计每个分组的总数
 楼主| 发表于 2013-11-22 16:46:36 | 显示全部楼层
站长苏飞 发表于 2013-11-22 09:00
这个看着不会太慢啊,会不会是因为你查的数据多,数据库反映慢啊,内存执行应该是很快的,应该也没有我少数 ...

[C#] 纯文本查看 复制代码
DB db = new DB();
             int[] Channel = new int[27];
[color=#ff0000][b]             DataTable dt=db.reDt(str);[/b][/color]
             for (int i = 0; i <= dt.Rows.Count - 1; i++)
             {
                 for (int j = 0; j < 85; j++)
                 {
                     switch (dt.Rows[i][j].ToString())
老大解决了,添加了这么一句。速度贼快,谢谢,不过想知道为啥?

我已经定义了:
      
[C#] 纯文本查看 复制代码
        public DataTable reDt(string cmdstr)
        {
            SqlConnection con = GetCon();
            SqlDataAdapter da = new SqlDataAdapter(cmdstr, con);
            DataSet ds=new DataSet();
            da.Fill(ds);
            return (ds.Tables[0]);
}


发表于 2013-11-22 17:08:50 | 显示全部楼层
呵呵,我是看明白了,你这个访问是用来访问数据库的,我还以为是要获取Table的
[C#] 纯文本查看 复制代码
db.reDt(str);
就是这个
如果加上这个
[C#] 纯文本查看 复制代码
DataTable dt=db.reDt(str);
表示只取一次数据库,而如果不加上,你下面是直接用的
[C#] 纯文本查看 复制代码
for (int i = 0; i <= db.reDt(str).Rows.Count - 1; i++)
            {
                for (int j = 0; j < 85; j++)
                {
                    switch (db.reDt(str).Rows[j].ToString())

也就是说每一次循环都要取数据库访问数据当然慢了,你加上了是只访问一次,而你不加是表示你循环多少次就访问多少次数据库,
你说能不慢吗?
 楼主| 发表于 2013-11-22 17:35:44 | 显示全部楼层
站长苏飞 发表于 2013-11-22 17:08
呵呵,我是看明白了,你这个访问是用来访问数据库的,我还以为是要获取Table的[mw_shl_code=csharp,true]db ...

哈哈,是啊
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-23 13:36

© 2014-2021

快速回复 返回顶部 返回列表