2010-07-27 200 views
2

我想用脚本来处理很多dta记录,让我们将其命名为process.php,问题是我有一个庞大的数据集,为了使工作更快完成,我想要运行该脚本的多个实例与同时运行php脚本

在/ usr/bin中/ PHP process.php START_RECORD end_record &

所以我让他们并行运行像

的/ usr /斌/ PHP process.php 0 10000 &

的/ usr /斌/ PHP process.php 10000 20000 &

的/ usr /斌/ PHP process.php 20000 30000 &

的/ usr/bin中/ PHP的过程.PHP 30000 40000 &

...

我认为这样的工作可以更快地完成,但后呃尝试我没有发现它快得多,而是速度似乎非常接近线性方式(没有并发性)。我不知道是否因为process.php将记录插入innodb表或什么。

任何想法。

回答

5

如果您需要将行插入到数据库中,它将完全没有区别。这是数据库的瓶颈,而不是你的PHP脚本。您仍然只能一次插入一行,因此每个并发实例只需要等待对方。

+0

谢谢。无论如何要解决这个问题? – Shawn 2010-07-27 08:21:36

+0

好点:先找到瓶颈;然后解决它。然后找到下一个瓶颈...... – xtofl 2010-07-27 08:23:25

+1

使用扩展插入和事务可能会提高性能(但不是四倍)。也可能对表格进行分区,或者在完成主要工作后实际创建四个单独的表格并将它们合并为一个表格。 这一切都假设您实际上有四个CPU内核可用于您的脚本。 – Mchl 2010-07-27 08:24:21

1

同时运行并不会帮助你,因为插入本身是瓶颈。

如果您基于相同的查询将数据插入表中,则可以进行几次优化。但是,一般来说,插入代价昂贵,并且如果您有大量数据集,则需要时间。

  1. 如上所述,使用类似PDO的库来利用预准备语句。
  2. 如果问题在于插入块阻止相关Web应用程序的性能,那么您可以通过将插入队列排队到某种类型的脚本中,从而将其中的一个块作为单个插入,如下所示:http://www.desilva.biz/mysql/insert.html

这些可能不会大量帮助,但他们可能会有所帮助。