C#处理大文本文件,如何高效去重复?

夏天的枫 2017-11-12 05:11:14
现有一个2000W行的文本文件txt1,
又有一个400W行的文本文件txt2
txt1的数据格式如下
x,y,id
txt2的数据格式如下
id,address
2中的id都是可以在1中找到的。
现在的实现思路就是简单的加入内存list,并利用linq的firstordefault方法进行循环去重,无奈效率实在低下(我跑了一个小时才4W行左右)
现在目的一是想将txt1中id在txt2中出现的去除掉
目的二是想把txt2中数据重组 弄成id,x,y,address这样的格式
如何更加高效的去做呢?
...全文
1034 49 点赞 打赏 收藏 举报
写回复
49 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
凤凰居士 2017-11-16
我只能想到用数据库
  • 打赏
  • 举报
回复
最后如果txt中的值必定唯一的话,多用HashSet,否则考虑是否可以排序,只要排序了,基本就能应用各种查找算法
  • 打赏
  • 举报
回复
如果txt不是你自身生成的,而是别人给你的,那你写个处理程序来将txt拆分成多个txt,一个程序对应txt1和txt2都能用
  • 打赏
  • 举报
回复
生成的txt本身就应该按规则拆分成多段,然后不管是1还是2文本,都遵循同样的规则放入对应的txt内(比如按模分值),这样才可以采用多线程同时处理,而且每行要查找的范围也就可能只要区区几千行(看你模值是多少,越大每个txt包含的数据就越少),另外线程也不要开太多,毕竟你数据量大,一下子开太多估计内存吃不消 否则2000w的每一行,必须都遍历400w中的所有记录,才能知道在不在400w里面,这效率能高的起来才怪
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-15
引用 38 楼 hjq624779687 的回复:
存储过程能够调用别人的接口在对返回进行json解析再取得x,y么
数据不是在你这边吗? 调别人的接口, 这个是做什么用的?
  • 打赏
  • 举报
回复
夏天的枫 2017-11-15
引用 30 楼 yenange 的回复:
[quote=引用 29 楼 hjq624779687 的回复:] 上次在csdn上看到一个程序员说要把2E数据导入到excel里 不知道现在手抓饼卖的怎么样了..
其实原本是存在数据库的,只是需要弄出来做下解析,比如生成我的X,Y字段,然后插入另外一张表用作生产 做这个解析呢倒是已经写好程序了,开两百个线程并把那几十个G的数据分开日夜不停的干,勉强能够赶上deadline,但是就怕跑一半挂掉了。。。就想搞个断点继续的机制。。。[/quote] 你直接在数据库写存储过程也很简单啊, 为什么要缘木求鱼? 如果数据库不够快, 可以加索引或改语句进行优化, 远比你折腾什么多线程靠谱。[/quote] 存贮过程能够调用别人的接口在对返回进行json解析再取得x,y么
  • 打赏
  • 举报
回复
Dogfish 2017-11-15
最好的方法是导入数据库。 如果一定要读进内存的话,要分段读。大概每次5000到8000左右。这个要看你机器的能力。
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-15
引用 47 楼 hjq624779687 的回复:
[quote=引用 46 楼 yenange 的回复:] [quote=引用 45 楼 hjq624779687 的回复:] [quote=引用 44 楼 yenange 的回复:] [quote=引用 43 楼 hjq624779687 的回复:] 把地址变为x,y(经纬度)
难道调用一次接口要返回几千万条记录?[/quote] 多个线程不停的调用,但是怕程序崩溃,没有接着继续跑的机制的话怕浪费时间,所以就在琢磨去重的事情[/quote] 处理过的就不再处理就是了, 或者在数据库的表中加一个字段来标识哪些已经处理过。 即使要去重也是数据库强项而不是程序的强项。[/quote] 这样应该就清楚了,谢谢[/quote] 没事就结贴吧,
  • 打赏
  • 举报
回复
夏天的枫 2017-11-15
引用 46 楼 yenange 的回复:
[quote=引用 45 楼 hjq624779687 的回复:] [quote=引用 44 楼 yenange 的回复:] [quote=引用 43 楼 hjq624779687 的回复:] 把地址变为x,y(经纬度)
难道调用一次接口要返回几千万条记录?[/quote] 多个线程不停的调用,但是怕程序崩溃,没有接着继续跑的机制的话怕浪费时间,所以就在琢磨去重的事情[/quote] 处理过的就不再处理就是了, 或者在数据库的表中加一个字段来标识哪些已经处理过。 即使要去重也是数据库强项而不是程序的强项。[/quote] 这样应该就清楚了,谢谢
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-15
引用 45 楼 hjq624779687 的回复:
[quote=引用 44 楼 yenange 的回复:] [quote=引用 43 楼 hjq624779687 的回复:] 把地址变为x,y(经纬度)
难道调用一次接口要返回几千万条记录?[/quote] 多个线程不停的调用,但是怕程序崩溃,没有接着继续跑的机制的话怕浪费时间,所以就在琢磨去重的事情[/quote] 处理过的就不再处理就是了, 或者在数据库的表中加一个字段来标识哪些已经处理过。 即使要去重也是数据库强项而不是程序的强项。
  • 打赏
  • 举报
回复
夏天的枫 2017-11-15
引用 44 楼 yenange 的回复:
[quote=引用 43 楼 hjq624779687 的回复:] 把地址变为x,y(经纬度)
难道调用一次接口要返回几千万条记录?[/quote] 多个线程不停的调用,但是怕程序崩溃,没有接着继续跑的机制的话怕浪费时间,所以就在琢磨去重的事情
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-15
引用 43 楼 hjq624779687 的回复:
把地址变为x,y(经纬度)
难道调用一次接口要返回几千万条记录?
  • 打赏
  • 举报
回复
夏天的枫 2017-11-15
引用 30 楼 yenange 的回复:
[quote=引用 29 楼 hjq624779687 的回复:] 上次在csdn上看到一个程序员说要把2E数据导入到excel里 不知道现在手抓饼卖的怎么样了..
其实原本是存在数据库的,只是需要弄出来做下解析,比如生成我的X,Y字段,然后插入另外一张表用作生产 做这个解析呢倒是已经写好程序了,开两百个线程并把那几十个G的数据分开日夜不停的干,勉强能够赶上deadline,但是就怕跑一半挂掉了。。。就想搞个断点继续的机制。。。[/quote] 你直接在数据库写存储过程也很简单啊, 为什么要缘木求鱼? 如果数据库不够快, 可以加索引或改语句进行优化, 远比你折腾什么多线程靠谱。[/quote] 存贮过程能够调用别人的接口在对返回进行json解析再取得x,y么
引用 39 楼 yenange 的回复:
[quote=引用 38 楼 hjq624779687 的回复:] 存储过程能够调用别人的接口在对返回进行json解析再取得x,y么
数据不是在你这边吗? 调别人的接口, 这个是做什么用的?[/quote] 把地址变为x,y(经纬度)
  • 打赏
  • 举报
回复
lescper2011 2017-11-14
引用 35 楼 From_TaiWan 的回复:
每天回复帖子,可得10分
这位兄台别搞笑
  • 打赏
  • 举报
回复
易2017 2017-11-14
引用 25 楼 diaodiaop 的回复:
这根本不是算法的问题的.. 2E数据保存到txt里 这本身你们觉得合理吗? 然后看到某些楼层说的 我笑个不停... 100W数据 10个线程 第一个线程读取前10W 第二个线程 读取10到20W.... 你这真是好办法啊.. 那我在开N个线程 读取一个超大txt 岂不是瞬间? 你这办法这么厉害你可以申请专利去研发一个 "超大文本读取器"了... ----------------------------------------------------- 既然技术上无法实现.我们应该换个角度想问题.. 比如这几百万的数据 是如何产生的? 比如自己的那你为什么不用数据库? 如果是第三方的 你为什么不监听txt插入数据库并清空txt? 方法有很多 你得从源头解决..否则你只能从错误的道路上越走越远啊.. 当然了 如果你一味的去最求"技术" 那我也只能祝福你了.. 上次在csdn上看到一个程序员说要把2E数据导入到excel里 不知道现在手抓饼卖的怎么样了..
我就是那个卖手抓饼的程序员,现在年入百万
  • 打赏
  • 举报
回复
正怒月神 2017-11-14
放数据库, 如果是查询,那么做成视图。
  • 打赏
  • 举报
回复
物联网_咸鱼 2017-11-14
引用 25 楼 diaodiaop 的回复:
这根本不是算法的问题的.. 2E数据保存到txt里 这本身你们觉得合理吗? 然后看到某些楼层说的 我笑个不停... 100W数据 10个线程 第一个线程读取前10W 第二个线程 读取10到20W.... 你这真是好办法啊.. 那我在开N个线程 读取一个超大txt 岂不是瞬间? 你这办法这么厉害你可以申请专利去研发一个 "超大文本读取器"了... ----------------------------------------------------- 既然技术上无法实现.我们应该换个角度想问题.. 比如这几百万的数据 是如何产生的? 比如自己的那你为什么不用数据库? 如果是第三方的 你为什么不监听txt插入数据库并清空txt? 方法有很多 你得从源头解决..否则你只能从错误的道路上越走越远啊.. 当然了 如果你一味的去最求"技术" 那我也只能祝福你了.. 上次在csdn上看到一个程序员说要把2E数据导入到excel里 不知道现在手抓饼卖的怎么样了..
就服你,开线程的那个确实不是方法,但人家心肠还是好的。
  • 打赏
  • 举报
回复
秋的红果实 2017-11-14
每天回复帖子,可得10分
  • 打赏
  • 举报
回复
by_封爱 版主 2017-11-14
这根本不是算法的问题的.. 2E数据保存到txt里 这本身你们觉得合理吗? 然后看到某些楼层说的 我笑个不停... 100W数据 10个线程 第一个线程读取前10W 第二个线程 读取10到20W.... 你这真是好办法啊.. 那我在开N个线程 读取一个超大txt 岂不是瞬间? 你这办法这么厉害你可以申请专利去研发一个 "超大文本读取器"了... ----------------------------------------------------- 既然技术上无法实现.我们应该换个角度想问题.. 比如这几百万的数据 是如何产生的? 比如自己的那你为什么不用数据库? 如果是第三方的 你为什么不监听txt插入数据库并清空txt? 方法有很多 你得从源头解决..否则你只能从错误的道路上越走越远啊.. 当然了 如果你一味的去最求"技术" 那我也只能祝福你了.. 上次在csdn上看到一个程序员说要把2E数据导入到excel里 不知道现在手抓饼卖的怎么样了..
  • 打赏
  • 举报
回复
正怒月神 2017-11-14
你既然只是去重,那为何不放在数据库,使用视图呢? 视图都帮你搞定了 也不需要在拿出来筛选了。
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-12 05:11
社区公告

让您成为最强悍的C#开发者