加速使用php处理大型文本数据和文件的算法

wd2eg0qa  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(328)

有两张tablebelow:-
文档表-此表包含实际包含html内容的文件的路径,并且还有一列用于层次结构

查找和替换-此表包含要查找和替换的单词(替换字符串可以是链接或html本身),其余字段是逗号分隔的id(表1中的文档id),它指示要在哪个文档中替换哪个单词

简而言之,这个过程将允许用户根据第二个表查找和替换关键字,并且只在所需的文档中进行。
算法的工作原理如下below:-
获取documents表中所有记录的计数
中断一组100条记录(以减少服务器超时)
使用文档id和层次结构遍历100条记录的集合,并在此处为每条记录获取关键字列表以及要替换的内容(注意,where条件在逗号分隔的字符串上运行)
使用第一个表中的路径从服务器获取文件并提取html内容
按顺序对每个关键字运行一个循环,并根据内容中的第二个表替换为所需的内容
创建最终文件并保存在服务器上
这个过程工作得很好,也得到了预期的结果。
当数据增加时,问题就开始了。到目前为止,第一个表中大约有50000个条目,因此服务器上的文件数量相同。
第二个表包含大约15000条find记录,用逗号分隔的长字符串替换关键字。
对于如此多的数据,此进程将运行数天,而这不应发生。
数据库使用mysql 5.5,后端为php(laravel5.4)。操作系统是centos 7和nginx web服务器。
有没有办法让这个过程更顺畅、更省时?感谢您的帮助。

clj7thdc

clj7thdc1#

php有一个函数shell\u exec($shellcommand);
您可能希望使用gnu/linuxshell可访问程序sed(streameditor)来进行这种替换,而不是将每个文件读入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相比,它的速度非常快。
编辑:为什么这种方法可以节省很多时间?
shell程序,如 sed 已经存在了几十年,并且高度优化。 sed 使用比php少得多的处理能力——少得多的cpu周期——来完成它所做的事情。因此文件的转换速度更快。
编辑文件的任务需要读取、转换和写入文件。按照您描述的方式执行此操作需要在下一个阶段开始之前完成这些阶段中的每一个。另一方面, sed 是一个流编辑器。它读、转换和写都是并行的。
为了充分利用这种方法,您需要让php程序编写比其他方法更复杂的编辑命令 's/this/that/g' . 你会想在一个单独的时间里做多个替换 sed 快跑。您可以通过如下示例连接编辑指令来完成此操作:

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

一个shell命令的长度大约为100k个字符,因此您可能不会达到这些编辑指令的长度限制。
建议使用 sed 我建议使用不同的算法。

相关问题