CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

求解,关于大数据量文件的处理问题。小弟给各位作揖了。。。。。

楼主yuezhong(妈咪,有小姐吗?便宜点的)2005-08-02 18:32:22 在 .NET技术 / ASP.NET 提问

 
  现在有一个文本文件  
  里面是以逐行方式排列的用户账号  
  我需要把里面的账号导入数据库中  
  文本里差不多有20万条记录,也就是20万行  
  而且在处理中必须要判断  
  例如账号是否重复等。。。。  
  测试了一下  
  10000以下还能承受  
  超过基本就未响应了  
  我的处理方法是先通过StreamReader.ReadLine()循环读取这个文本  
  问题是在循环中还需要判断  
  光20万次循环就够呛了  
  三分钟过去都没反映  
   
  so,问题是:有什么好的办法能改进这个读取速度,使之能承受多一点数据量  
   
  ps:我也知道用文本存这么大数据很sb,但是客户那边都是些业务员来搞这玩意(不懂电脑的火星人?)  
   
  谢谢各位,进来的有意见提意见,没意见帮顶,照给分 问题点数:100、回复次数:23Top

1 楼powerllr(笨笨的招财鸡)回复于 2005-08-02 18:44:42 得分 10

如果不判断的话可以用DTS包做,保证快,爽死你。  
  导入后可以再去数据库找那些错误的记录Top

2 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 18:48:38 得分 0

贴一个大概的处理  
  if(   condition1   )  
  {  
        while()  
        {  
                if(业务逻辑判断1)  
                  {  
                          读数据库;  
                    }        
                if(业务逻辑判断2)  
                    {  
                          读数据库;  
                      }      
                组合sql;  
        }  
  }  
  执行sql;  
  Top

3 楼dcren118(酒仙)回复于 2005-08-02 18:49:38 得分 10

就读取来说   DATAREAD   是最快的了!   不过用完要马上关闭!  
   
  实在太慢操作的时候用存储过程   加     事物日志   提交!  
   
  20万   应该   没什么问题     不算多!Top

4 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 18:51:30 得分 0

哥哥,我从文本读呢  
  怎么用dataReader?Top

5 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 18:53:55 得分 0

自己顶起来~~~Top

6 楼jeseechen(jesee)回复于 2005-08-02 19:00:23 得分 10

要不直接倒入数据库,再在数据库中进行处理Top

7 楼navy_koo(平湖秋水)回复于 2005-08-02 19:16:28 得分 15

我以前碰到一个类似读文件再分析的问题,不过我读得是xml,然后我从xml转为DataSet,速度还可以;  
  您这个不知道是否方便转为xml。如果不方便,我建议您可以考虑下面两种方法:  
   
  (1)   像yuezhong所说的,不要判断一次就写一下db,可以成批写,这样速度会提高;  
  (2)   读文件慢,可以考虑用多个线程来处理。(当然如果你的数据之间有强相关性就不太好做了,这时你可以考虑把文件分割成几个小文件试试,可以缓解内存压力)。  
   
   
  仅供参考~Top

8 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 19:17:07 得分 0

调试了一下  
  主要的瓶颈在于读这个文本的过程  
  11万的数据需要很长的时间  
  可能是读文本的方式readline()很费时间  
  这么一来  
  即使是全部读入数据库也不太好  
  因为瓶颈在读取的过程  
  导入数据库反而多了一步操作  
   
  我现在的想法是  
  是否可以把处理放在后台进行(多线程?汗!没有处理过多线程)  
   
  另外  
  是不是可以把文件分成几个部分  
  几个线程同时读?  
   
  请各位指教Top

9 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 19:18:59 得分 0

。。。。。。  
  分成几个小文件要怎么操作?  
  感觉想flashget。。。。Top

10 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 19:27:55 得分 0

晕  
  这么快就沉了。。。。Top

11 楼yjlbukn(聪哥)回复于 2005-08-02 19:33:38 得分 30

哎呀  
  你如何几个线程同时读?  
  文件io是只有一个哈  
  你可以使用异步调用方式  
  然后不用让用户等就是了  
  还有你readlan后把已经读取的行删掉就是了  
  速度会越来越快撒  
  最重要的是:  
  先只管读取,然后直接写到一个字符串数组  
  然后统一判断!  
  你就可以一次判断很多行了!  
  这样可以减少数据库的往返次数(频繁数据库连接是十分耗费资源的!)  
  最后成批的生成插入语句,批量添加()  
   
  其次你可以使用dataAdpter,就可以不用生成sql语句哈!Top

12 楼yjlbukn(聪哥)回复于 2005-08-02 19:35:39 得分 0

还有:只管读取的方式是说按批次读取,比如读一次就读1000行,然后处理  
  然后再读1000行,知道没有读的了就完成Top

13 楼yjlbukn(聪哥)回复于 2005-08-02 19:39:22 得分 0

还有就是先格式化文件,比如行用"|"  
  分割,就可以把多个行合并成一个行,  
  读一行然后转换成字符串再拆分字符串就可以读一次就得到很多行了撒Top

14 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 19:47:36 得分 0

yjlbukn(聪哥)    
  见笑了。。。。不晓得文件io只有一个  
  8过判断的步骤需要读数据库  
  例如有些约束,这些数据不能插入表。。。  
  (我想先不管,读进入再说)  
  异步的方式。。。  
  我试试先。。。。Top

15 楼zhilunchen(他山居士)回复于 2005-08-02 19:48:47 得分 20

是有点难度,这样做:先把全部数据导入一张临时表,然后用一条查询语句将不重复的帐号查询出来添加到你的正式表.  
  insert   into   YourTable(AccountNo,...)  
          select   a.AccountNo,...   from   YourTempTable   as   a  
          where   (a.AccountNo   not   in   (select   distinct   b.AccountNo   from   YourTable   as   b   order   by   b.AccountNo))  
  Top

16 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-02 20:11:11 得分 0

回家。。。。  
  明天再说。。。。Top

17 楼skyfarwolf(Computer)回复于 2005-08-02 20:35:44 得分 2

UP  
  学习!Top

18 楼bccuiopniexin(csdnNieXin)回复于 2005-08-02 20:48:39 得分 2

upTop

19 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-04 00:03:57 得分 0

取得一点点进展  
  1、避免读取文本的瓶颈  
        不再采用readline()的方法编历文本,  
        而是一次性把所有文本读进字符串  
        然后处理字符串取出账号  
  2、循环中不做判断,把数据读入一个临时表  
        然后在数据库中处理  
   
  测试一下,循环所需时间大大减少,主要的时间消耗在插入20万条记录进临时表(4分钟左右)  
  现在的问题是:  
  提高在数据库中处理的效率  
  需要的判断主要有:  
      1、临时表中的记录不在表a和表b中的,才插入User表  
      2、根据记录,如果在表c中,则更新,否则插入  
      判断1我用了外连接的方式避免not   in   和not   exsit  
      三表的数据分别是6万,5万,2万时,大致需要12秒左右  
   
  问题是:  
  判断2比较麻烦,因为需要根据user表中的每条记录,去update或者insert另一张表  
  现在我想到的只是根据判断1,删除重复的数据,使数据量尽量减少  
  再就是用存储过程去判断update或insert  
  这样可能就需要使用游标。。。。  
  但是数据量几十万,用游标是否合适?还是在程序里判断呢?  
   
  游标方式和在循环中判断,哪种的效率会高些?  
  原来的代码在循环中判断,处理5万条需要1小时以上。。。。。。  
  取消判断,只需要15秒。。。  
  游标方式没有尝试过  
   
   
  望各位不吝赐教。。。。任何意见都欢迎  
   
   
         
  Top

20 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-04 00:10:56 得分 0

上面说的处理5万条需要1小时以上。。。。。。  
  取消判断,只需要15秒。。。  
  只是说循环的时间(并不操作数据库)  
   
  另外,插入记录进临时表的动作,是否还有优化的可能?  
  我是组合sql,成批insert的  
   
  ps:以前看林锐的高质量c++编程,记得有一个循环判断的问题  
      if()  
      {  
            for()  
            {  
                  do   something;  
            }  
      }  
  和  
      for()  
    {  
        if()  
        do   something;  
      }  
   
  当时看着只是扫过一眼,现在是真有体会。。。。果然是实践检验真理Top

21 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-04 00:12:36 得分 0

明天接着优化。。。。  
  希望这贴子别这么快沉Top

22 楼niefeng9455(pandan)回复于 2005-08-04 17:36:38 得分 1

学习   学习Top

23 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-08-10 10:03:38 得分 0

忘了来给分......  
  csdn的人气......  
  Top

相关问题

  • 100分求解!!!java读三维图形数据文件!!!!
  • 求解:如何将excel文件的数据导入到dbf数据库中
  • 求解数据库问题
  • (急!在线求解)怎么样以二进制的方式向文件尾部追加数据?
  • 高分求解:带有BDE的数据库exe文件如何脱离CB运行?
  • 高分求解一个怪问题:执行完query.open 之后就没法打开数据库文件
  • 高分求解一个怪问题:执行完query.close 之后就没法打开数据库文件
  • 在前台将某个excel文件导入至后台的数据库中(高分求解,谢谢!)
  • 小女子跪拜求解:在C#中怎样把DataSet中的数据生成CSV文件?
  • 高分求解决方案,怎样快速将网站日志文件导入到MS SQLServer数据库中!!!

关键词

  • 数据库
  • 文件
  • 数据
  • 文本
  • 循环
  • 账号
  • 线程
  • 学习
  • 判断
  • 处理

得分解答快速导航

  • 帖主:yuezhong
  • powerllr
  • dcren118
  • jeseechen
  • navy_koo
  • yjlbukn
  • zhilunchen
  • skyfarwolf
  • bccuiopniexin
  • niefeng9455

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo