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

yuezhong 2005-08-02 06:32:22

现在有一个文本文件
里面是以逐行方式排列的用户账号
我需要把里面的账号导入数据库中
文本里差不多有20万条记录,也就是20万行
而且在处理中必须要判断
例如账号是否重复等。。。。
测试了一下
10000以下还能承受
超过基本就未响应了
我的处理方法是先通过StreamReader.ReadLine()循环读取这个文本
问题是在循环中还需要判断
光20万次循环就够呛了
三分钟过去都没反映

so,问题是:有什么好的办法能改进这个读取速度,使之能承受多一点数据量

ps:我也知道用文本存这么大数据很sb,但是客户那边都是些业务员来搞这玩意(不懂电脑的火星人?)

谢谢各位,进来的有意见提意见,没意见帮顶,照给分
...全文
191 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuezhong 2005-08-10
  • 打赏
  • 举报
回复
忘了来给分......
csdn的人气......
yuezhong 2005-08-04
  • 打赏
  • 举报
回复
明天接着优化。。。。
希望这贴子别这么快沉
yuezhong 2005-08-04
  • 打赏
  • 举报
回复
上面说的处理5万条需要1小时以上。。。。。。
取消判断,只需要15秒。。。
只是说循环的时间(并不操作数据库)

另外,插入记录进临时表的动作,是否还有优化的可能?
我是组合sql,成批insert的

ps:以前看林锐的高质量c++编程,记得有一个循环判断的问题
if()
{
for()
{
do something;
}
}

for()

if()
do something;


当时看着只是扫过一眼,现在是真有体会。。。。果然是实践检验真理
yuezhong 2005-08-04
  • 打赏
  • 举报
回复
取得一点点进展
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秒。。。
游标方式没有尝试过


望各位不吝赐教。。。。任何意见都欢迎



niefeng9455 2005-08-04
  • 打赏
  • 举报
回复
学习 学习
bccuiopniexin 2005-08-02
  • 打赏
  • 举报
回复
up
skyfarwolf 2005-08-02
  • 打赏
  • 举报
回复
UP
学习!
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
回家。。。。
明天再说。。。。
zhilunchen 2005-08-02
  • 打赏
  • 举报
回复
是有点难度,这样做:先把全部数据导入一张临时表,然后用一条查询语句将不重复的帐号查询出来添加到你的正式表.
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))
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
yjlbukn(聪哥)
见笑了。。。。不晓得文件io只有一个
8过判断的步骤需要读数据库
例如有些约束,这些数据不能插入表。。。
(我想先不管,读进入再说)
异步的方式。。。
我试试先。。。。
yjlbukn 2005-08-02
  • 打赏
  • 举报
回复
还有就是先格式化文件,比如行用"|"
分割,就可以把多个行合并成一个行,
读一行然后转换成字符串再拆分字符串就可以读一次就得到很多行了撒
yjlbukn 2005-08-02
  • 打赏
  • 举报
回复
还有:只管读取的方式是说按批次读取,比如读一次就读1000行,然后处理
然后再读1000行,知道没有读的了就完成
yjlbukn 2005-08-02
  • 打赏
  • 举报
回复
哎呀
你如何几个线程同时读?
文件io是只有一个哈
你可以使用异步调用方式
然后不用让用户等就是了
还有你readlan后把已经读取的行删掉就是了
速度会越来越快撒
最重要的是:
先只管读取,然后直接写到一个字符串数组
然后统一判断!
你就可以一次判断很多行了!
这样可以减少数据库的往返次数(频繁数据库连接是十分耗费资源的!)
最后成批的生成插入语句,批量添加()

其次你可以使用dataAdpter,就可以不用生成sql语句哈!
yuezhong 2005-08-02
  • 打赏
  • 举报
回复

这么快就沉了。。。。
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
。。。。。。
分成几个小文件要怎么操作?
感觉想flashget。。。。
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
调试了一下
主要的瓶颈在于读这个文本的过程
11万的数据需要很长的时间
可能是读文本的方式readline()很费时间
这么一来
即使是全部读入数据库也不太好
因为瓶颈在读取的过程
导入数据库反而多了一步操作

我现在的想法是
是否可以把处理放在后台进行(多线程?汗!没有处理过多线程)

另外
是不是可以把文件分成几个部分
几个线程同时读?

请各位指教
navy_koo 2005-08-02
  • 打赏
  • 举报
回复
我以前碰到一个类似读文件再分析的问题,不过我读得是xml,然后我从xml转为DataSet,速度还可以;
您这个不知道是否方便转为xml。如果不方便,我建议您可以考虑下面两种方法:

(1) 像yuezhong所说的,不要判断一次就写一下db,可以成批写,这样速度会提高;
(2) 读文件慢,可以考虑用多个线程来处理。(当然如果你的数据之间有强相关性就不太好做了,这时你可以考虑把文件分割成几个小文件试试,可以缓解内存压力)。


仅供参考~
jeseechen 2005-08-02
  • 打赏
  • 举报
回复
要不直接倒入数据库,再在数据库中进行处理
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
自己顶起来~~~
yuezhong 2005-08-02
  • 打赏
  • 举报
回复
哥哥,我从文本读呢
怎么用dataReader?
加载更多回复(3)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧