使用 PHP 为大型文本数据和文件加速算法
Posted
技术标签:
【中文标题】使用 PHP 为大型文本数据和文件加速算法【英文标题】:Speed up an algorithm using PHP for large textual data and files 【发布时间】:2019-02-17 09:44:42 【问题描述】:有两个表如下:-
-
文档表 - 此表包含实际包含 html 内容的文件的路径,并且还有一个层次结构列
-
查找和替换 - 此表包含要查找和替换的单词(替换字符串可以是链接或 HTML 本身),其余字段是逗号分隔的 ids(表 1 中的文档 ID),说明要查找的单词替换在哪个文档中
简而言之,这个过程将允许用户根据第二个表并且仅在所需的文档中查找和替换关键字。
该算法的工作原理如下:-
-
获取文档表中所有记录的计数
以 100 条记录为一组(以减少服务器超时)
在此处使用文档 ID 和层次结构为每条记录循环 100 条记录,没有获取关键字列表以及要替换的内容以在此特定文档中替换(注意,条件运行在逗号分隔的字符串)
使用第一个表中的路径从服务器获取文件并提取 HTML 内容
按顺序对每个关键字运行循环,并根据内容中的第二个表替换为所需的内容
创建最终文件并保存在服务器上
该过程运行良好,并且也提供了预期的结果。
当数据增加时,问题就开始了。就目前而言,第一个表中有大约 50,000 个条目,因此服务器上的文件数量相同。
第二个表包含大约 15000 条查找和替换关键字的记录,用逗号分隔的长字符串与文档 ID。
对于这么多的数据,这个过程会运行几天,这不应该发生。
数据库使用 mysql 5.5,后端是 php(Laravel 5.4)。操作系统为 centos 7,带有 nginx 网络服务器。
有没有一种方法可以让这个过程顺利进行并减少耗时?任何帮助表示赞赏。
【问题讨论】:
请edit您的问题告诉我们哪个操作系统运行您的php和mySQL代码。 CentOS 7 是,希望你现在能帮忙 【参考方案1】: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
使用的处理能力要少得多——cpu 周期要少得多——比 php 来完成它的工作。因此文件的转换速度更快。
编辑文件的任务需要读取、转换和写入文件。按照您描述的方式执行此操作需要在下一个阶段开始之前完成每个阶段。另一方面,sed
是一个流编辑器。它并行读取、转换和写入。
要充分利用这种方法,您需要让 php 程序编写比's/this/that/g'
更复杂的编辑命令。您需要在一次 sed
运行中进行多次替换。您可以通过连接编辑指令来做到这一点,如下例所示:
's/this/that/; s/blue/azul/g; s/red/rojo/g'
单个 shell 命令的长度可能约为 100K 个字符,因此您可能不会达到这些编辑指令长度的限制。
通过建议使用sed
,我确实建议使用不同的算法。
【讨论】:
有许多循环正在运行,即使替换是由 shell 运行的,这是否仍然需要时间? 如果可以,请建议和替代方法以上是关于使用 PHP 为大型文本数据和文件加速算法的主要内容,如果未能解决你的问题,请参考以下文章