berezuev
@berezuev
#define TRUE FALSE

Есть огромный csv-файл с данными (over 100k строк). Как все это добро на PHP, без SSH, загнать в MySQL?

Здравствуйте. Задача: есть огромный csv-файл с данными (over 100k строк).
Нужно все это добро на PHP, без SSH загнать в MySQL бд... Лимит 30 сек.
Пробовал читать файл по 1000 строк (каждый раз приходится его открывать), естественно, в 30 сек оно не укладывается.

Как такие вещи делают гуру?
  • Вопрос задан
  • 6643 просмотра
Решения вопроса 1
begemot_sun
@begemot_sun
Программист в душе.
Почитайте про LOAD DATA INFILE ( dev.mysql.com/doc/refman/5.1/en/load-data.html )

например с его помощью 40 млн 4кб строк грузились 40 мин (причем узким местом был php, который генерил эти данные) .. в вашей ситуации это будет намного быстрее думаю.
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
@lizergil
Алгоритм в твоем случае будет таким:
1. Удаление всех индексов из таблицы, куда планируется записывать данные.
2. Открытие файла (fopen).
3. Чтение m строк (fgets) пока не конец файла.
4. Составление запроса в виде одной пачки (batch): INSERT INTO ... VALUES ( %row1%, %row2%, ... , %rowm%);
5. Выполение запроса.
6. Переход к шагу 3.
7. Конец файла, закрытие файла, строим удаленные индексы.

Если шаги 3 и 4 выполнять параллельно, то можно сэкономить на памяти.

По поводу лимита: у тебя сложность алгоритма O(n) - т. е. линейно зависит от кол-ва строк в файле, ускорить (если недостаточно) поможет либо оптимизация (использования низкоуровневых утилит для вставки данных, но данные эти заранее должны быть подготовлены), либо использование более производительного железа (клиента, сети, сервера).
Ответ написан
Приходилось парсить файлы с огромным количеством e-mail'ов, при похожих условиях. Я использовал аякс как прокладку. С одной php забирал данные на клиент, и потом партиями отправлял в другую, где вставлял все это в базу.

Могу отправить Вам на почту этот скрипт, правда он довольно топорный, делался в спешке. Для его использования лучше разбить файл на несколько частей и запустить парсинг в несколько окон, чтоб быстрее было. Если что допилите, как Вам нужно.
Ответ написан
svd71
@svd71
Пробовал читать файл по 1000 строк (каждый раз приходится его открывать), естественно, в 30 сек оно не укладывается...


Таки вещи делаются через AJAX. Файл открывается на сервере и в браузер клиента пересылается инфа о количестве строк. Далее клиент позылает через AJAX короткие задания: занести в базу строки с 1 по 10. Даже при большом файле на короткие операции не такие уж длинное время требуется. После выполнения этоко маленького куска сервер через AJAX сообщает результат операции: успешно внесено, ошибка в строке NNN или что то еще.

Минусом идет то, что у клиента все время должна быть открыта сессия браузера. При ее закрытии ничего бельше непосылается серверу и оперции останавливаются.
Ответ написан
@lubezniy
Я обычно на клиентской стороне бью файл на части, копирую на ftp. А там специальный скрипт с GET-параметром, в котором стоит счётчик, читает сначала первую часть, даёт редирект на вторую; вторая на третью - и так до конца заливки.
Ответ написан
vapmaster
@vapmaster
Открывайте файл не весь, а кусками по N байт. Например, с помощью CURL.
Ответ написан
а открыть файл один раз памяти не хватает или что?
Ответ написан
easyman
@easyman
А что мешает читать php скриптом файл не с начала и записывать на какой строке (на каком байте в потоке) остановились?
Ответ написан
CybernatiC
@CybernatiC
Веб-разработчик
Уважаемые товарищи, такая же муть и у меня :-D спасайте
Ответ написан
Комментировать
saintbyte
@saintbyte
Django developer
100к - аккуратно экселем на кусочки (эксель тянет до 999 999) . потом phpmyadmin аккуратно кусочки в базу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы