免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3099 | 回复: 9
打印 上一主题 下一主题

如何实现文件内容的并行搜素 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-25 23:49 |只看该作者 |倒序浏览
如题,处理器为双核,以linux内核源代码为目标文件,利用多线程实现,线程数目可自由设定,形式为
iditify -j n  filename    -j后面的n为线程数目


我想问的是  如何实现多线程并发分解任务,同时保证每个线程所搜素的内容不重叠

[ 本帖最后由 kuluwang 于 2009-3-26 02:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-26 01:41 |只看该作者

回复 #1 kuluwang 的帖子

多多支持,自己顶一下

论坛徽章:
0
3 [报告]
发表于 2009-03-26 09:09 |只看该作者
原帖由 kuluwang 于 2009-3-25 23:49 发表
如题,处理器为双核,以linux内核源代码为目标文件,利用多线程实现,线程数目可自由设定,形式为
iditify -j n  filename    -j后面的n为线程数目


我想问的是  如何实现多线程并发分解任务,同时保证每个 ...


我想的是,用一个主线程来进行搜索的分配。具体如下:

首先,开启j个子线程,然后在主线程中chdir到你要搜索的那个目录下,此时主线程读当前目录下的所有文件。
if 该文件为目录
将这个目录传递给当前空闲的子线程
else //该文件为普通文件
检查该文件是否为你查找的那个文件

而在子线程中则:
接收主线程传递过来的路径,在该路径中搜索要搜索的那个文件
如果这个目录搜索完毕之后则等待主线程分配下一个目录

比如说在主目录下有:
a/ b/ c/ d/ e
那么主线程就将对a目录的搜索分配给第一个线程,然后将对b目录的搜索分配给第二个线程。

不过这种方式可能有个问题就是 如果a目录中的文件远远多于b c d这三个目录中的文件。此时若有2个线程,那么可能对b c d进行搜索的线程已经停止,而对a进行搜索的那个线程仍在工作。

论坛徽章:
0
4 [报告]
发表于 2009-03-26 09:52 |只看该作者
原帖由 scutan 于 2009-3-26 09:09 发表
不过这种方式可能有个问题就是 如果a目录中的文件远远多于b c d这三个目录中的文件。此时若有2个线程,那么可能对b c d进行搜索的线程已经停止,而对a进行搜索的那个线程仍在工作。

那主线程再给其它空闲线程分配任务不就完了,如果最后仅此这一项任务了,那单线程不管处理多长时间,该等的还是得等

PS:好像LZ的需要是搜索指定文件的内容,而不是去搜索目录的目标文件。。。

论坛徽章:
0
5 [报告]
发表于 2009-03-26 10:01 |只看该作者
我问个问题,也许跑题了,就是硬盘这种结构最耗时的地方是移动磁头,那么如果多个线程需要读写磁盘的位置相互距离太远,导致移动磁头的距离太长,最后程序的瓶颈出在IO上,效率还是很低?

论坛徽章:
0
6 [报告]
发表于 2009-03-26 10:15 |只看该作者
原帖由 springtty 于 2009-3-26 10:01 发表
我问个问题,也许跑题了,就是硬盘这种结构最耗时的地方是移动磁头,那么如果多个线程需要读写磁盘的位置相互距离太远,导致移动磁头的距离太长,最后程序的瓶颈出在IO上,效率还是很低?

是这样的

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-03-26 10:42 |只看该作者

回复 #1 kuluwang 的帖子

不知道你这个程序是怎样的,如果是多个线程,我猜测是把文件平分,然后每个线程独立搜索自己平分的那一部分

论坛徽章:
0
8 [报告]
发表于 2009-03-26 10:53 |只看该作者
原帖由 dreamice 于 2009-3-26 10:42 发表
不知道你这个程序是怎样的,如果是多个线程,我猜测是把文件平分,然后每个线程独立搜索自己平分的那一部分

那这样问题又来了,假如和要搜索目标匹配的内容被你平分了,那就不匹配了。。。
算了,还是别搞多线程了,去优化搜索算法吧

论坛徽章:
0
9 [报告]
发表于 2009-03-26 12:28 |只看该作者
原帖由 alexhappy 于 2009-3-26 09:52 发表

那主线程再给其它空闲线程分配任务不就完了,如果最后仅此这一项任务了,那单线程不管处理多长时间,该等的还是得等

PS:好像LZ的需要是搜索指定文件的内容,而不是去搜索目录的目标文件。。。


如果是搜索文件的内容,也可以这样。

论坛徽章:
0
10 [报告]
发表于 2009-03-26 13:31 |只看该作者
多线程并不是灵丹妙药,并不一定会提高效率,它本身也是有缺点的,所以合适的地方才采用。
像楼主的这种情况,瓶颈在IO上,用多线程意义不大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP