2016-10-18 2 views
1

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

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

  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, я не уверен, действительно ли это может принести пользу алгоритму.

+0

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

Смежные вопросы