Ускорьте алгоритм с использованием PHP для больших текстовых данных и файлов - PullRequest
0 голосов
/ 12 сентября 2018

Ниже приведены две таблицы: -

  1. таблица документов - эта таблица содержит путь к файлу, который фактически содержит HTML-содержимое, а также имеет столбец для иерархии

найти и заменить - эта таблица содержит слово для поиска и замены (строка замены может быть ссылкой или сам HTML), а остальные поля - идентификаторы, разделенные запятыми (идентификатор документа из таблицы 1), который указывает, какое слово должно бытьзаменено в каком документе

Короче говоря, этот процесс позволит пользователю находить и заменять ключевые слова на основе второй таблицы и только внеобходимые документы.

Алгоритм работает следующим образом: -

  1. Получить количество всех записей в таблице документов
  2. Разбить на 100 наборов записей (чтобы уменьшитьтайм-аут сервера)
  3. цикл по набору 100 каждый и для каждой записи здесь с использованием идентификатора документа и иерархии не получить список ключевых слов, а также содержимое, которое будет заменено для замены в этом конкретном документе (Примечание, условие where выполняется в строке, разделенной запятыми)
  4. извлечь файл с сервера, используя путь в первой таблице, и извлечь HTML-продолжениеent
  5. запустить цикл для каждого ключевого слова в последовательности и заменить требуемым содержимым согласно второй таблице в содержимом
  6. создать окончательный файл и сохранить на сервере

Процесс работает нормально и дает желаемые результаты.

Проблема начинается с увеличения данных.На данный момент в первой таблице содержится около 50 000 записей и, следовательно, столько же файлов на сервере.

Вторая таблица содержит около 15 000 записей поиска и заменяет ключевые слова длинными строковыми запятыми, разделенными идентификатором документов..

Для такого количества данных этот процесс будет выполняться в течение нескольких дней, и этого не должно происходить.

Для базы данных используется MySQL 5.5, а бэкэнд - PHP (Laravel 5.4).ОС Centos 7 с веб-сервером nginx.

Есть ли способ сделать этот процесс гладким и менее трудоемким?Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 сентября 2018

php имеет функцию shell_exec ($ shellCommand);

Вы можете использовать программу, доступную для оболочки gnu / linux, которая называется sed (stream editor) чтобы выполнить эту замену, вместо того, чтобы глотать каждый файл в 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.

Edit : Почему этот подход экономит много времени?

  • Такие программы оболочки, как sed, существуют уже десятки лет и высоко оптимизированы.sed использует гораздо меньшую вычислительную мощность - гораздо меньше циклов ЦП - чем php, чтобы делать то, что он делает.Таким образом, преобразование файлов происходит быстрее.
  • Задача редактирования файла требует его чтения, преобразования и записи.Выполнение этой операции так, как вы описываете, требует, чтобы каждая из этих фаз завершилась до начала следующей.С другой стороны, sed - это потоковый редактор.Он читает, преобразует и записывает все параллельно.

Чтобы получить максимальную отдачу от этого подхода, вам нужно заставить вашу php-программу писать более сложные команды редактирования, чем 's/this/that/g'.Вы хотите сделать несколько замен за один sed прогон.Вы можете сделать это путем объединения инструкций по редактированию, как в этом примере:

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

Одна команда оболочки может иметь длину около 100 КБ, поэтому вы, вероятно, не будете ограничивать длину этих инструкций по редактированию.

Предлагая использовать sed, я предлагаю использовать другой алгоритм.

...