【问题标题】:Browser crashes when about around 4 million records entered in MYSQL在 MYSQL 中输入大约 400 万条记录时浏览器崩溃
【发布时间】:2009-08-22 22:17:16
【问题描述】:

我下载了一个导出为 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);
?>

【问题讨论】:

    标签: php mysql insert fopen mysql-connect


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试了类似的方法——到目前为止,我已经使用 PHP 将超过 200 万行插入到 MySQL 数据库中。浏览器有被太多数据淹没的趋势,IE比FF敏感一点。
    • 哦,我应该补充一点,我已经插入了超过 200 万条记录,但不是一次插入。到目前为止的最大值约为 250k,在我减少屏幕输出量之前,浏览器往往会阻塞。
    【解决方案2】:

    我不知道为什么你需要一个网络浏览器来将记录插入 mysql。为什么不直接使用数据库本身的导入工具,而将网络排除在外?

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

    你在使用 InnoDB 吗?

    【讨论】:

    • 使用网络浏览器插入记录,可以由相对不熟练的操作员完成,无需登录MySQL和使用命令。它非常适合现代的“我点击哪个按钮?”文化。
    • 嗨,duffymo,我使用浏览器是因为最终用户没有技能也无法使用其他方式:D
    【解决方案3】:
    1. 我首先注意到的是您使用 flush() 不安全。当 httpd 缓冲区已满时执行 flush() 会导致错误并且您的脚本终止。放弃所有这些 myflush() 解决方法,改用单个 @987654321@()

    2. 您无需通过浏览器查看它即可使其工作到最后,您可以放置​​一个@987654322@(),这样即使您的浏览器死机,您的代码也能完成其工作。

    3. 不确定您的浏览器为何死机。也许您的脚本生成的内容过多。

    【讨论】:

    • 谢谢haveard,我现在试试,看看效果
    【解决方案4】:

    试一试


    暂停:nnnn

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

    还有,长转过程中PHP是否超时?

    另外,你有 sleep(10) 也无济于事。

    【讨论】:

    • 传输过程中没有超时,大约400万条记录时,浏览器冻结,他的进程增加内存消耗直到崩溃
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 2020-02-27
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          相关资源
          最近更新 更多