Мне нужно запустить ежедневное задание cron, которое выполняет итерацию по файлу CSV размером 6 МБ, чтобы вставить каждый из ~ 10000 записей в таблицу MySQL. Код, который я написал, зависает и через некоторое время создает тайм-аут.PHP Импорт большого CSV-файла в таблицу MySQL
if (($handle = fopen($localCSV, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$dbdata = array(
'SiteID' => $siteID,
'TimeStamp' => $data[0],
'ProductID' => $data[1],
'CoordX' => $data[2],
'CoordY' => $data[3]
);
$row++;
$STH = $DBH->prepare("INSERT INTO temp_csv (SiteID,TimeStamp,ProductID,CoordX,CoordY) VALUES (:SiteID,:TimeStamp,:ProductID,:CoordX,:CoordY)");
$STH->execute($dbdata);
}
fclose($handle);
echo $row." rows inserted.";
}
Было бы идеально, чтобы использовать mysql_*
функции вместо PDO, так что я мог взрываться значения в одном запросе (хотя огромная), но, к сожалению, мне нужно соблюдать некоторые рекомендации (PDO быть строго используется) ,
Я искал SO и есть очень похожие вопросы, но никто не смог решить мою проблему. То, что я пробовал, является следующим:
1- Ran LOAD DATA INFILE
и LOAD DATA LOCAL INFILE
запросов, но при этом сохраняются ошибки «файл не найден», хотя файл определенно существует с 777 правами доступа. Сервер БД и общая учетная запись хостинга находятся в разных средах. Я пробовал относительные и URL-пути к файлу csv, но не повезло (не удалось найти файл в обоих случаях).
2- Я разбил файл csv на 2 файла и запускал сценарий для каждого, чтобы увидеть порог, на котором висит скрипт, но он вставил записи дважды в таблицу в случае каждого файла.
У меня нет доступа к php.ini
, так как это общая учетная запись (облачные сайты) и доступ к MySQL
через phpMyAdmin.
Что еще я могу попытаться сделать это максимально эффективно?
Любая помощь приветствуется.
Я занимаюсь с .csv -> mysql часто, и моя общая стратегия заключается в том, чтобы делать несколько записей на вставку, например. ВСТАВИТЬ В СТОИМОСТЬ ЗНАЧЕНИЙ (один, два), (три, четыре), (пять, шесть) и т. Д. – Dave
Выполнение пакетной вставки будет лучше, чем отдельная вставка для каждой строки. – user602525
Спасибо @Dave, но как я могу это сделать с PDO в цикле while? Он работал бы с mysql_ *, но я не могу его использовать. –