解决一个1.89兆次的数据交集的效率方式方法

西蒙君霸占阿花 2017-07-11 04:07:14

小弟最近在用C#做一个数据交集类的软件遇到了前所未有的麻烦,就不贴代码了,只是想问一下大神们怎么解决效率的问题

1,我有102个文件,每一个文件内有254100组数据 每组数据 6个数
2,第一步,我需要将102个文件导入到软件类形成一种样式,就是类似与下图

3,第二步就是最恼火的一个步骤了
a,在数据中,我需要每每16条数据取交集,请注意是每每16条
b,也就是说每每16条数据交集在102个文件中就有1.89兆次交集方式
c,现在最好的方式就是每16条交集出来的时间是0.02秒,我需要一次计算每每16条的交集
d,我也需要将这一次计算的这个时间效率 每16条交集一次就是0.02秒,那么1.89兆*0.02我怕也是一个天文数字的时间


总结一下也求助一下:
我用C#写不出来更好的效率,我已经测试过用数据库,效率更慢,也试用过内存,占内存的很。

不知道有没有C++或者是C大神能够将这个算法给写出来呢?

酬谢酬谢酬谢!
...全文
388 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakabulusi 2017-07-18
  • 打赏
  • 举报
回复
算法上可以进行优化,而且可以有效节约运算次数和运算时间。方法有很多种,有牺牲空间换时间的,也有其他算法可以进行改进。 如果确实没有改进算法的话,我想当今的世界上就不会有oracle sqlserver db2 等大型数据库了
清泉流 2017-07-18
  • 打赏
  • 举报
回复
这么大的数据量计算怎么优化都提高不了多少,我认为还是从这些数据里面寻找规律,重新组织结构,减少计算次数这方面考虑比较好吧
  • 打赏
  • 举报
回复
优化首先是算法和数据结构的优化,然后才是语言。
  • 打赏
  • 举报
回复
谢谢大家的回复,我这边准备用汇编来写一下了,这样的方式注定是不太好行得通的!数据量还是大
赵4老师 2017-07-15
  • 打赏
  • 举报
回复
我个人资料里面有qq
kakabulusi 2017-07-14
  • 打赏
  • 举报
回复
你的数据来源是什么?
ID870177103 2017-07-14
  • 打赏
  • 举报
回复
引用 11 楼 Siimon 的回复:
[quote=引用 9 楼 ID870177103 的回复:] 可以分治,比如说16个项的交集分成15个项的交集,与剩余任意一项的交集 因此动态规划就是,先计算两两交集,再计算44交集,。。。 这种方法可以跳过前面交集就为空的情况
这样出来的数据是不准确的数据 , 所以说是 要PASS掉的[/quote] 怎么会不准确,难道交集还不满足结合律了?
  • 打赏
  • 举报
回复
引用 9 楼 ID870177103 的回复:
可以分治,比如说16个项的交集分成15个项的交集,与剩余任意一项的交集 因此动态规划就是,先计算两两交集,再计算44交集,。。。 这种方法可以跳过前面交集就为空的情况
这样出来的数据是不准确的数据 , 所以说是 要PASS掉的
  • 打赏
  • 举报
回复
引用 4 楼 ID870177103 的回复:
像这种大数据不适合用数据库,除非他能够直接给你结果,你肯定要分批处理的,算上io时间的话,肯定会花很多时间的
就是要花的时间太长太长了。现在没有找到合适的解决方案
ID870177103 2017-07-14
  • 打赏
  • 举报
回复
可以分治,比如说16个项的交集分成15个项的交集,与剩余任意一项的交集 因此动态规划就是,先计算两两交集,再计算44交集,。。。 这种方法可以跳过前面交集就为空的情况
  • 打赏
  • 举报
回复
引用 3 楼 ID870177103 的回复:
交集最快是bitset,然而要求数据区间小 否则的话先排序,每组只有6个 然后交替比较,两两数据项比较最坏是12次比较 每每16项就是,180次比较,这个时间应该远小于0.02s
嗯嗯,这个方式我可以考虑一下看一下,主要是有 1.89兆次 也是一个不小的时间呀
  • 打赏
  • 举报
回复
引用 5 楼 lianshaohua 的回复:
不能分布治之吗?利用多台电脑
分布做的话,也需要很长时间呀,主要是计算数量摆在那里呢!
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
虽然来说 我看不太懂你的代码,但是我以C#的方式来做的话,确实做不出来,数据量太大了,我这边有个关于这个的小项目,有没有兴趣做一下呢?
ID870177103 2017-07-14
  • 打赏
  • 举报
回复
比如说简单说求{a,b,c,d,e}的44交集 r1=a&b&c&d&∅ r2=a&b&c&∅&e r3=a&b&∅&d&e r4=a&∅&c&d&e r5=∅&b&c&d&e 一共5个结果 可以变成 t1=a&b r1=t1&c&d r2=t1&c&e r3=t1&d&e 减少公共表达式 并且如果确认t1=∅ r1,r2,r3都为∅ 很容易写出求集合交集的递归表达式
intersection (set , ib , ie) {
	if (ib == ie)
		return empty_set ;
	ix = ib + (ie - ib) / 2 ;
	return intersection (set ,ib ,ix) + intersection (set ,ix ,ie) ;
}
然后把它改成动态规划即可
  • 打赏
  • 举报
回复
引用 12 楼 ID870177103 的回复:
[quote=引用 11 楼 Siimon 的回复:] [quote=引用 9 楼 ID870177103 的回复:] 可以分治,比如说16个项的交集分成15个项的交集,与剩余任意一项的交集 因此动态规划就是,先计算两两交集,再计算44交集,。。。 这种方法可以跳过前面交集就为空的情况
这样出来的数据是不准确的数据 , 所以说是 要PASS掉的[/quote] 怎么会不准确,难道交集还不满足结合律了?[/quote] 组合是需要每每16个,要是分割了的话,怎么进行交集操作呢?所以出来的数据是不准确的
  • 打赏
  • 举报
回复
引用 13 楼 kakabulusi 的回复:
你的数据来源是什么?
数据来源就是大底数据,嘿嘿。 然后将大底数据分成每组 6个数字,组成一个文件 这样的文件一共有102个 每个文件内有254100组由6个数字组成的数组
ID870177103 2017-07-12
  • 打赏
  • 举报
回复
像这种大数据不适合用数据库,除非他能够直接给你结果,你肯定要分批处理的,算上io时间的话,肯定会花很多时间的
ID870177103 2017-07-12
  • 打赏
  • 举报
回复
交集最快是bitset,然而要求数据区间小
否则的话先排序,每组只有6个
然后交替比较,两两数据项比较最坏是12次比较
每每16项就是,180次比较,这个时间应该远小于0.02s
ztenv 版主 2017-07-12
  • 打赏
  • 举报
回复
不能分布治之吗?利用多台电脑
赵4老师 2017-07-11
  • 打赏
  • 举报
回复
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
加载更多回复(1)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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