关于高效的大表关联查询的问题
时间:2011-07-21
来源:互联网
1、文本文件 a 是一列数字, 50 W 的记录量 :
2
5
12
14
17
2、文件 b 有 5列,1200W 的记录量,字段分别是 文件 a 的start范围、文件 a 的end范围, col3, col4, col5
1 2 c13 c14 c15
3 3 c23 c24 c25
7 9 c33 c34 c35
13 20 c43 c44 c45
3、需求:a中的元素如果在b中的第一列与第二列之间,就算匹配成功,然后输出后面的3、4、5列到文件 c
例如 运行脚本后,c中的内容应该是:
c13 c14 c15
c43 c44 c45
c43 c44 c45
4、由于机器性能内存、cpu所限,自己写的awk处理太慢了,一秒钟才出来一个结果,看大家有没有更高效简洁的办法,谢谢!
2
5
12
14
17
2、文件 b 有 5列,1200W 的记录量,字段分别是 文件 a 的start范围、文件 a 的end范围, col3, col4, col5
1 2 c13 c14 c15
3 3 c23 c24 c25
7 9 c33 c34 c35
13 20 c43 c44 c45
3、需求:a中的元素如果在b中的第一列与第二列之间,就算匹配成功,然后输出后面的3、4、5列到文件 c
例如 运行脚本后,c中的内容应该是:
c13 c14 c15
c43 c44 c45
c43 c44 c45
4、由于机器性能内存、cpu所限,自己写的awk处理太慢了,一秒钟才出来一个结果,看大家有没有更高效简洁的办法,谢谢!
作者: xrzs1986 发布时间: 2011-07-21
本帖最后由 106033177 于 2011-07-21 22:11 编辑
回复 xrzs1986
如果a是递增的;b区间是递增的且不重复,可以这样,效率没做测试。
复制代码
回复 xrzs1986
如果a是递增的;b区间是递增的且不重复,可以这样,效率没做测试。
- def f():
- a=-1
- for s in open('e:/b.txt','r'):
- ss=s.split()
- start,end=int(ss[0]),int(ss[1])
- while a < start:
- a= yield
- a=int(a)
- if a >= start and a <= end:
- a = yield s
- a=int(a)
- g=f()
- g.next()
- for s in open('e:/a.txt','r'):
- r= g.send(s)
- if r:
- print r
作者: 106033177 发布时间: 2011-07-21
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28