#php #python #mysql #arrays #csv
#php #python #mysql #массивы #csv
Вопрос:
Я имею дело с файлами CSV, которые обычно содержат от 2 до 5 миллионов строк. У меня есть (например) 3000 конкретных значений, которые необходимо заменить 3000 другими значениями. У меня есть два массива из 3000 элементов, называемых $search и $replace. Примечание: Фразы поиска и замены являются полными значениями (например …,search,… -> …,replace,…). Кроме того, я в конечном итоге импортирую это в базу данных mysql.
Какой был бы наиболее эффективным / быстрым способом добиться этого?
-
Загрузите все содержимое файла CSV в строку и запустите str_replace, используя массивы и строку
-
Загрузите файл CSV в массивы и используйте array_search() для замены значений
-
Загрузите файл CSV в базу данных mysql, а затем выполните поиск и замену с помощью запросов
-
Используйте python вместо
-
Другое
Я знаю, что мог бы настроить некоторые тесты и сравнить их время выполнения, но я больше хочу понять, почему один лучше другого, или механизм, с помощью которого они ищут (например: 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 для данных в виде целой строки быстрее в памяти или нет.