当在MYSQL中输入约400万条记录时,浏览器崩溃

时间:2009-08-22 22:17:17

标签: php mysql insert fopen mysql-connect

我下载了一个导出为TXT格式的数据库,大约700MB,有700万条记录(每行1条)。 我制作了一个脚本将数据导入mysql数据库,但是当插入大约400万条记录时,浏览器崩溃了。 我在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 个答案:

答案 0 :(得分:2)

尝试以100 MB的块分割文件。这是完成工作的快速解决建议。浏览器问题可能很难解决。尝试不同的浏览器。

如果发生崩溃,phpMyadmin可以选择继续查询。如果脚本检测到接近时间限制,则允许中断导入。这可能是导入大文件的好方法,但它可能会破坏事务。

答案 1 :(得分:2)

我不确定为什么你需要一个Web浏览器来将记录插入mysql。为什么不直接使用数据库本身的导入工具并将其从Web中删除?

如果那是不可能的,我想知道是否一次将插入分组成1000个组会有所帮助。我建议不要将整个数据库作为单个事务提交。

您使用的是InnoDB吗?

答案 2 :(得分:2)

  1. 我首先注意到的是你不安全地使用flush()。当httpd缓冲区已满时执行flush()会导致错误,并且脚本将死亡。放弃所有这些myflush()变通方法,改为使用单个ob_implicit_flush()

  2. 您无需在浏览器中看到它就可以使其工作到最后,您可以放置​​ignore_user_abort(),这样即使您的浏览器死亡,您的代码也将完成其工作。

  3. 不确定您的浏览器为什么会死亡。也许你的脚本产生了太多的内容。

答案 3 :(得分:1)

尝试没有

&LT峰; br&GT;暂停:nnnn

输出到浏览器,看看是否有帮助。可能只是浏览器在要求渲染的长网页上窒息。

此外,PHP在长时间转移期间是否超时?

你也睡觉(10)增加了它所花费的时间也没有帮助。

答案 4 :(得分:0)

您可以尝试将文件拆分为不同的TXT文件,然后使用这些文件重做该过程。我知道我至少曾经使用过这种方法。

答案 5 :(得分:0)

浏览器窒息,因为请求耗时太长而无法完成。这个过程是否应该成为网页的一部分?如果您绝对必须这样做,请考虑将数据拆分为可管理的块。

答案 6 :(得分:0)

使用PHP-CLI在命令行中运行代码。这样,您就不会遇到长时间运行过程的超时。虽然,情况是你的浏览器在超时之前崩溃^^。 如果您尝试在没有shell访问权限的托管服务器中执行,请使用crontab运行代码。但是,您必须确保crontab 仅运行一次