php — Что быстрее для поиска и замены в файле CSV? В строке или в массиве?

#php #python #mysql #arrays #csv

#php #python #mysql #массивы #csv

Вопрос:

Я имею дело с файлами CSV, которые обычно содержат от 2 до 5 миллионов строк. У меня есть (например) 3000 конкретных значений, которые необходимо заменить 3000 другими значениями. У меня есть два массива из 3000 элементов, называемых $search и $replace. Примечание: Фразы поиска и замены являются полными значениями (например …,search,… -> …,replace,…). Кроме того, я в конечном итоге импортирую это в базу данных mysql.

Какой был бы наиболее эффективным / быстрым способом добиться этого?

  1. Загрузите все содержимое файла CSV в строку и запустите str_replace, используя массивы и строку

  2. Загрузите файл CSV в массивы и используйте array_search() для замены значений

  3. Загрузите файл CSV в базу данных mysql, а затем выполните поиск и замену с помощью запросов

  4. Используйте python вместо

  5. Другое

Я знаю, что мог бы настроить некоторые тесты и сравнить их время выполнения, но я больше хочу понять, почему один лучше другого, или механизм, с помощью которого они ищут (например: O (n), двоичный поиск и т.д.?)

Ответ №1:

Если ваш файл CSV такой большой (> 1 миллиона строк), возможно, не лучшая идея загружать его все сразу, если использование памяти вас не беспокоит.

Поэтому я бы рекомендовал выполнять замену построчно. Вот очень простой пример:

 $input = fopen($inputFile, 'r');
$output = fopen($outputFile, 'r ');

while (!feof($input)) {
    $input = fgets($input);

    $parsed = str_replace($search, $replace, $input);

    fputs($output, $parsed);
}
  

Это должно быть достаточно быстро, и это также позволяет вам легко отслеживать прогресс. Если вы когда-нибудь захотите заменить только определенный столбец, вы можете использовать fgetcsv и fputcsv вместо fgets и fputs .

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

Что касается python, я не уверен, может ли он каким-либо образом принести пользу алгоритму.

Комментарии:

1. Большое спасибо за предложения! Я также согласен с тем, что, исходя из моего опыта, было лучше обрабатывать данные с использованием php вместо импорта, а затем через mysql. Хотя я знаю, что это много памяти, я знаю, что машина, на которой выполняется этот скрипт, имеет достаточно памяти для этой задачи, не используется ни для чего, кроме этой задачи, и будет выполнять только одну задачу за раз. Итак, я изначально использовал ваш построчный метод (в памяти строки, хранящиеся в массиве, разносятся и взрываются для управления этим), но я не знал, будет ли str_replace для данных в виде целой строки быстрее в памяти или нет.