Сбой браузера при вводе около 4 миллионов записей в MYSQL

StackOverflow https://stackoverflow.com/questions/1317188

Вопрос

Я загрузил базу данных, которая была экспортирована в формат TXT и имеет около 700 Мбайт с 7 миллионами записей (по 1 на строку).Я создал скрипт для импорта данных в базу данных mysql, но когда в нее вставлено около 4 миллионов записей, браузер выходит из строя.Я тестировал в Firefox и IE.Может кто-нибудь высказать мне свое мнение и дать несколько советов по этому поводу?

Сценарий заключается в следующем:

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
Это было полезно?

Решение

Попробуйте разбить файл на куски по 100 МБ.Это быстрое решение проблемы, позволяющее выполнить работу.Проблема с браузером может оказаться сложной для решения.Попробуйте также разные браузеры.

В phpMyAdmin есть опции для продолжения запроса, если произошел сбой.Позволяет прервать импорт в случае, если скрипт обнаружит, что он близок к ограничению по времени.Это может быть хорошим способом импортировать большие файлы, однако это может привести к нарушению транзакций.

Другие советы

Я не уверен, зачем вам нужен веб-браузер для вставки записей в mysql.Почему бы просто не использовать средства импорта самой базы данных и не использовать Интернет?

Если это невозможно, я бы задался вопросом, поможет ли разбиение вставок на группы по 1000 за раз.Вместо того чтобы фиксировать всю базу данных как единую транзакцию, я бы рекомендовал разбить ее.

Используете ли вы InnoDB?

  1. Что я впервые заметил, так это то, что вы используете flush() небезопасно.Выполнение flush() при заполнении буфера httpd приводит к ошибке, и ваш скрипт завершает работу.Откажитесь от всего этого обходного пути myflush() и используйте один ob_implicit_flush ( об_имплицитная промывка )() вместо этого.

  2. Вам не нужно просматривать его в своем браузере, чтобы заставить его работать до конца, вы можете разместить игнорируй_пользователь_работ() таким образом, ваш код выполнит свою работу, даже если ваш браузер умрет.

  3. Не уверен, почему ваш браузер умирает.Возможно, ваш скрипт генерирует слишком много контента.

Попробуйте это без

<br> Пауза:нннн

выведите в браузер и посмотрите, поможет ли это.Это может быть просто из-за того, что браузер захлебывается на длинной веб-странице, которую его просят отобразить.

Кроме того, истекает ли время ожидания PHP во время длительной передачи?

Не помогает также то, что у вас есть sleep (10), увеличивающий время, которое на это уходит.

Вы можете попробовать разделить файл на разные текстовые файлы и повторить процесс, используя файлы.Я знаю, что, по крайней мере, однажды использовал этот подход.

Браузер захлебывается, потому что выполнение запроса занимает слишком много времени.Есть ли причина, по которой этот процесс должен быть частью веб-страницы?Если вам абсолютно необходимо сделать это таким образом, подумайте о разделении ваших данных на управляемые фрагменты.

Запустите свой код в командной строке, используя PHP-CLI.Таким образом, вы никогда не столкнетесь с тайм-аутом для длительно выполняющегося процесса.Хотя, ситуация заключается в сбое вашего браузера до истечения тайм-аута ^^.Если вы попытаетесь выполнить на хостинговом сервере, к которому у вас нет доступа к командной строке, запустите код с помощью crontab.Но вы должны убедиться, что crontab запускайте только один раз!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top