技术开发 频道

如何并行化我的应用

  【IT168 技术】

  注:本文为IT168&NVIDIA联合举办的“如何并行化我的应用”方案征集活动参赛作品。本次方案征集活动详情见:http://cuda.itpub.net/thread-1299715-1-1.html。近期活动的大部分方案,将会逐步与大家分享,不可错过哦!

  CUDA ZONE专区:http://cuda.it168.com/

  CUDA技术论坛:http://cuda.itpub.net

  自从09年底初,我一直负责我们公司内一套全文检索系统的升级与开发。

  今年年初的时候,随着公司内部的很多系统都开始调用这套全文检索系统所提供的接口,于是有了统计关键词的需求。

  为了不影响正常调用,关键词被记录中文本文件中。每天一个文本文件,记录关键词,结果数,来源,还有调用时间。

  对于统计关键词的需求,最初的设想是:每天凌晨2点去读取前一天生成的日志文件,将关键词记录插入mysql数据表,然后进行分析,统计。于是用php写了程序,在linux服务器上,利用crontab定时任务,在cli模式下运行。

  最开始,每天有30万左右的关键词记录,数据表中也没有记录,运行一次php程序,需要一个小时左右的时间。一个礼拜后,当数据库中的关键词记录超过200万时,发现从早上临晨2点运行到下午6点,还没有将昨天记录的关键词完全插入数据库。

  最初的目标是,每天早上可以看到上一天的关键词统计,但是今天到了下班,依然没有将上一天的关键词插入数据库。

  调试程序发现,昨天的关键词记录比前几天多,而主要的时间,是花费在计算重复关键词的次数上。计算重复关键词的次数,是通过和数据表中已有关键词的次数计算出的,这就需要去先从关键词表中读出数据。虽然数据表建立了索引,但是随着数据表记录的增大,以及每天要导入的关键词记录的增多,这个时间消耗,还是很可观的。

  优化方案如下:

  1. 将记录关键词的文本文件拆分,每天,每个应用下的所有关键词,记录在一个文本文件。这样,每天将不再是一个关键词文件,而是每个应用都有一个关键词文件

  2. 将关键词数据表拆分,每个应用,有一个关键词记录表。

  将关键词文件拆分之后,就可以并行把每天,每个应用下的所有关键词插入数据表。

  具体实施如下:

  1. 用php编写程序,将某个应用下的关键词插入对应的数据表,只是将文本文件中记录的关键词,一行一行插入数据表,并不计算重复关键词的次数,读取一个15m左右的文本文件,耗时不到10分钟。

  2. 用pcntl_fork创建子进程,并行读取当天的所有应用下的关键词文件,并插入临时数据表。

  3. 通过group by sql语句,计算出当天重复关键词的次数。

  4. 通过select into sql语句,将计算后的数据导入新的数据表。

  进行优化之后,读取一个15m,大约35万条记录的关键词文件,并插入数据表,只需要不到30分钟的时间。

  因为采用了按照每个应用类型,将关键词分开记录,用并行的方式读取这些文本文件,插入数据表,所以当再增加应用,这个时间也不会增加多少。而在第一次插入数据时,并没有计算重复关键词的次数,随着关键词记录的增多,这个时间也不会变化多少。

  计算重复关键词的次数,是通过数据库的sql数据实现。这个时间,在数据表记录增多时,也会增加,但是在可以接受的范围。通过这样的改进,每天早上,都可以看到前一天搜索关键词的统计。

0
相关文章