Сбой браузера, когда в MYSQL введено около 4 миллионов записей - PullRequest
1 голос
/ 23 августа 2009

Я скачал базу данных, которая была экспортирована в формат 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);
?>

Ответы [ 7 ]

2 голосов
/ 23 августа 2009
  1. Первое, что я заметил, это то, что вы используете flush () небезопасно. Выполнение flush (), когда буфер httpd заполнен, приводит к ошибке и ваш скрипт умирает. Откажитесь от всего этого обходного пути myflush () и используйте вместо него один <a href="http://www.php.net/ob_implicit_flush" rel="nofollow noreferrer">ob_implicit_flush</a>().

  2. Вам не нужно видеть его в браузере, чтобы он работал до конца, вы можете поместить <a href="http://www.php.net/manual/en/function.ignore-user-abort.php" rel="nofollow noreferrer">ignore_user_abort</a>(), чтобы ваш код завершил свою работу, даже если ваш браузер умрет. 1010 *

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

2 голосов
/ 23 августа 2009

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

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

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

2 голосов
/ 23 августа 2009

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

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

1 голос
/ 23 августа 2009

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


Пауза: nnnn

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

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

Также не помогает то, что вы спите (10), прибавляя ко времени, которое требуется.

0 голосов
/ 23 августа 2009

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

0 голосов
/ 23 августа 2009

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

0 голосов
/ 23 августа 2009

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

...