Вопрос не совсем про yii..
скорее архитектурный..
Есть большой csv файл. Фактически база данных. 5млн строк, объем около гига. При этом он регулярно обновляется (то есть компания получает его извне)
Он содержит кучу ошибок, да еще и структурирован через одно место (одни и те же значения могут быть занесены слегка по разному).
Нужно вычистить ошибки по возможности (sanitize) и сгруппировать элементы (заменить название чуть по разному на одно и тоже)
Вопрос в том как это делать)
Кидать все в базу и с ней работать, но это очень медленно. Работать кусками, но проблема, что почистить можно по частям, а вот группировать требует всех вариантов по файлу значит всех записей.
Ну и по времени такая процедура как сейчас написано требует пары дней))
Значит как то по частям делать и в крон или асинхронно.
Прошу прощения за сумбур, может у кого какие идеи есть?
Если не стоит вопрос по БД.
Можно все данные записать в промежуточную пустую таблицу (потом её truncate перед новой загрузкой).
Потом брать из нее запись и сравнивать с записью из текущей.
Можно считать добавленные и обновившиеся.
// Работало на PG с лямом строк
$data = file_get_contents($file);
// Разбиваем на строки
$rows = explode("\n", $data);
// Удаляем названия столбцов (первую строку) если надо
array_shift($rows);
// Очистим таблицу
Yii::$app->db->createCommand('TRUNCATE auto_csv;')->execute();
// Делаем подключение к БД для прямого залива данных в пустую таблицу
$db = pg_connect('host=* port=* dbname=*=* password=*');
// Вставляем строки в таблицу - не должно быть индексов и первичных ключей
pg_copy_from($db, 'auto_csv', $rows);
// Создаем первичный ключ
Yii::$app->db->createCommand('ALTER TABLE auto_csv ADD CONSTRAINT pk-auto_csv-id PRIMARY KEY(id);')->execute();
// Обновим статистику для таблицы
Yii::$app->db->createCommand('VACUUM ANALYZE auto_csv;')->execute();