有两个表,如下所示:-
简而言之,此过程将允许用户根据第二个表并仅在所需的文档中查找和替换关键字。
该算法的工作原理如下:-
该过程运行良好,并且也提供了预期的结果。
当数据增加时,问题开始。到目前为止,第一个表中大约有50,000个条目,因此服务器上的文件数量相同。
第二个表包含大约15000条find记录,并用长字符串逗号替换文档ID替换关键字。
对于如此大量的数据,此过程将持续数天,并且不会发生。
对于数据库,使用MySQL 5.5,后端为PHP(Laravel 5.4)。操作系统是带有Nginx Web服务器的centos 7。
是否有一种方法可以使此过程顺利进行并节省时间?任何帮助表示赞赏。
答案 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
,我确实建议使用其他算法。