使用PHP加快大型文本数据和文件的算法

时间:2018-09-12 17:18:19

标签: mysql laravel algorithm large-data large-files

有两个表,如下所示:-

  1. 文档表-该表包含文件的路径,该文件实际上包含HTML内容,并且还具有用于层次结构的列

  1. 查找并替换-该表包含要查找和替换的单词(替换字符串可以是链接或HTML本身),其余字段是逗号分隔的ID(表1中的文档ID),用于指示要替换的单词替换为哪个文件

简而言之,此过程将允许用户根据第二个表并仅在所需的文档中查找和替换关键字。

该算法的工作原理如下:-

  1. 获取文档表中所有记录的计数
  2. 中断每组100条记录(以减少服务器超时)
  3. 使用文档ID和层次结构在每个记录的100个集合上循环,没有获取关键字列表以及要在此特定文档中替换的内容(请注意,条件在其中运行逗号分隔的字符串)
  4. 使用第一个表中的路径从服务器获取文件并提取HTML内容
  5. 依次对每个关键字运行循环,并根据内容中的第二个表替换为所需的内容
  6. 创建最终文件并保存在服务器上

该过程运行良好,并且也提供了预期的结果。

当数据增加时,问题开始。到目前为止,第一个表中大约有50,000个条目,因此服务器上的文件数量相同。

第二个表包含大约15000条find记录,并用长字符串逗号替换文档ID替换关键字。

对于如此大量的数据,此过程将持续数天,并且不会发生。

对于数据库,使用MySQL 5.5,后端为PHP(Laravel 5.4)。操作系统是带有Nginx Web服务器的centos 7。

是否有一种方法可以使此过程顺利进行并节省时间?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

php具有功能shell_exec($shellCommand);

您可能希望使用名为sed (stream editor)的gnu / linux shell可访问程序进行此替换,而不是将每个文件都放入php中,然后再次将其写出。

例如,

 $result = shell_exec
      ("cd what/ever/directory; sed 's/this/that/g' inputfile > outputfile");

将读取what/ever/directory/inputfile,将所有this字符串更改为that,然后将结果写入what/ever/directory/outputfile。而且,与php相比,它将非常快速地完成该任务。

编辑:为什么这种方法可以节省很多时间?

  • sed这样的Shell程序已经存在了数十年,并且已经过高度优化。 sed比php使用更少的处理能力-更少的cpu周期。因此文件的转换更快。
  • 编辑文件的任务需要读取,转换和写入。按照您所描述的方式进行此操作需要完成每个阶段,然后才能开始下一个阶段。另一方面,sed是流编辑器。它并行读取,转换和写入。

要充分利用这种方法,您需要使php程序编写比's/this/that/g'更复杂的编辑命令。您将需要在一次sed运行中进行多次替换。您可以通过串联以下示例的编辑说明来做到这一点:

 's/this/that/; s/blue/azul/g; s/red/rojo/g'

单个shell命令的长度大约为100K个字符,因此您可能不会对这些编辑指令的长度造成限制。

通过建议使用sed,我确实建议使用其他算法。