Mysql PHP内存不足的致命错误

Mysql PHP内存不足的致命错误,mysql,fatal-error,phpinfo,Mysql,Fatal Error,Phpinfo,我在名为RebuildSummary()的函数中调用以下两个函数 创建_摘要() insertdatafromfile() 1.创建_摘要函数 create_summary函数从数据库获取活动数据,并使用for each循环遍历活动,并将数据插入以下文本文件,如下所示: zfilename71801404123.txt 2.insertdatafromfile函数 insertdatafromfile函数将读取同一文本文件[zfilename71801404123.txt]的内容,并使用LOAD

我在名为RebuildSummary()的函数中调用以下两个函数

  • 创建_摘要()
  • insertdatafromfile()
  • 1.创建_摘要函数 create_summary函数从数据库获取活动数据,并使用for each循环遍历活动,并将数据插入以下文本文件,如下所示:

    zfilename71801404123.txt 2.insertdatafromfile函数 insertdatafromfile函数将读取同一文本文件[zfilename71801404123.txt]的内容,并使用LOAD DATA命令将其插入汇总表

    代码 系统配置: PHPINFO 我的问题: 调用RebuildSummary函数时出现以下错误

    [17-Apr-2014 03:54:42 America/Los_Angeles] PHP Fatal error:  Out of memory (allocated 1517289472) (tried to allocate 64 bytes) in C:\HostingSpaces\wwwroot\system\database\drivers\mysql\mysql_result.php on line 162
    

    我在服务器端有足够的内存,但系统如何显示此错误“内存不足”

    1517289472字节~=1.4G
    ,因此您遇到了一个障碍

    首先你应该注意的是你正在设置内存限制:20000M,也就是20G。你的系统上只有6G。PHP可能会混淆,默认为较低的限制,或者运行在Windows7上的PHP版本可能有硬限制


    或者您可以运行32位Apache/PHP进程,其硬限制在2G左右。请参见:

    如果您要处理大量数据,请不要使用
    fetch_all()
    ,我假设您在数据库类中使用的是
    fetch_all()

    您应该单独获取每条记录,例如:

    while ($row = mysqli_fetch_array($link)) {
        // insert row into file
    }
    
    下面是一个以前有人做过的简单基准测试,以说明内存使用的差异:


    扰流器:100Mb与400bytes之比与PHP的内存大小无关。如果它是一个32位编译,它永远不会使用超过4gig utter max和实用的~3gig

    至于您的代码,您正在将整个数据库结果吸入ram中,然后构建一个字符串(实际上是内存需求的两倍),然后将该字符串转储到文件中。由于内存明显不足,因此必须对字符串进行流式处理,例如

    $fh = fopen(...);
    $separator = '';
    while($row = fetch_from_db()) {
         fwrite($fh, $sep . $row[0]);
         $separator = '|';
    }
    

    这有点低效,但应该足以让您大致了解情况。一个更有效的解决方案是构建一个有限长度的字符串并定期将其写出。e、 g.当您的凝聚字符串达到(比如)1兆时,您将其写出,然后将字符串重置为空。

    看起来像是100%重复的字符串
    max_input_time: 60000
    max_file_uploads: 2048M
    memory_limit: 20000M
    post_max_size: 20000M
    upload_max_filesize: 15000M
    
    [17-Apr-2014 03:54:42 America/Los_Angeles] PHP Fatal error:  Out of memory (allocated 1517289472) (tried to allocate 64 bytes) in C:\HostingSpaces\wwwroot\system\database\drivers\mysql\mysql_result.php on line 162
    
    while ($row = mysqli_fetch_array($link)) {
        // insert row into file
    }
    
    $fh = fopen(...);
    $separator = '';
    while($row = fetch_from_db()) {
         fwrite($fh, $sep . $row[0]);
         $separator = '|';
    }