2010-11-11 104 views
0

虽然运行进口大量数据导入mysql PHP脚本,我遇到了以下错误:内存限制用尽

memory exhausted near ''$GPGGA','130735.000','60.15751','N','24.74303','E','1','05','1.6','8.7','M','35' at line 1 

我现在之前,在我的PHP INI文件分配256M内存限制。迄今为止,这种记忆已经足够我的脚步,直到现在我还没有遇到任何问题。我已经导入了大小为1MB和2.84MB的文件,同时将内存限制保持在256MB。当我运行约1MB的文本文件时发生此错误。

我假定错误引用的内存是PHP内存限制。是否可以设置其他内存限制?我希望在解决这个问题上提出一些建议。非常感谢。

新编辑

... 
... 
if (is_array($inFile)) { 

foreach($inFile as $inFileName) { 

    $newFilePath = $upload_directory."/".$inFileName; 

    if($inFileName != "") 

    $handle = fopen($newFilePath,"r"); 
    $numlines =1; 

    $query = "INSERT INTO gga_raw_data(device_id, gga_date, nmea, gga_time, latitude, north, longitude, east, fixed_quality, no_of_satelites, hdop, altitude, meters, height_of_geoid, metres, check_sum, test_case_id) values"; 
    while (($data = fgetcsv($handle)) !== FALSE) 
    { 
     $numlines++; 

     $myDay=substr($data[1], 0,2); 
     $myMonth=substr($data[1], 2,2); 
     $myYear=substr($data[1], 4,2); 

     $gga_date = convertToNiceDate($myDay, $myMonth, 2000+$myYear); 

     $longitude = convertToDegrees($data[6]); 
     $latitude = convertToDegrees($data[4]); 


     if (!isset($data[16])) { 
      $data[16] = ''; 
     } 

     $query .="('$data[0]','$gga_date','$data[2]','$data[3]','$latitude','$data[5]','$longitude','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]','$data[12]','$data[13]','$data[14]', '$data[15]', '$data[16])',"; 


    } 

    $query = substr($query, 0,-1); 

我不希望启动一个新的问题,因为它仍然是在这个问题上。 我已经解决了“内存耗尽”的问题,但现在有一个MySQL查询错误已经使我的生活相当悲惨,我需要帮助。

这是我的输入数据从文本文件的样本:

1,070610,$GPGGA,080323.460,6013.45368,N,02445.28396,E,1,04,4.6,18.3,M,35.0,M,,*67 
1,070610,$GPGGA,080327.000,6013.44424,N,02445.31214,E,1,05,1.9,30.8,M,35.0,M,,*66 

这不同于回声$查询结果:

INSERT INTO gga_raw_data(device_id, gga_date, nmea, gga_time, latitude, north, longitude, east, fixed_quality, no_of_satelites, hdop, altitude, meters, height_of_geoid, metres,check_sum) values('1','2010,06,07','$GPGGA','080323.460','60.22423','N','24.75473','E','1','04','4.6','18.3','M','35.0','M','')('1','2010,06,07','$GPGGA','080327.000','60.22407','N','24.7552','E','1','05','1.9','30.8','M','35.0','M','') 
)('1','2010,06,07','$GPGGA','053416.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','053431.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','062929.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080250.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080305.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080305.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080320.000','0','','0','','0','','','','','','','') 


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('1','2010,06,07','$GPGGA','080327.000','60.22407','N','24.7552','E','1','05','1' at line 1 

我已经开始注意到,最后一个变量来自输入数据的“* 67”未被查询解析​​。我不确定它是否因为以*开头而未被识别。

+1

请表现出更多的情况下,也许一些代码。那个错误信息来自哪里?它不是PHP的默认“内存不足”消息,听起来更像是来自mySQL – 2010-11-11 12:27:41

+0

正在运行的脚本包含一个查询,它运行一个查询,但使用while循环执行多次插入。另一个补充只是2个功能隐蔽日期和2个领域。 Peharps你是对的。它应该来自mySQL – ibiangalex 2010-11-11 12:31:16

+0

我正在运行一个wampserver,但我不知道你的意思,如果你可以显示一些例子。 – ibiangalex 2010-11-11 14:21:06

回答

2

执行插入一次或分批它们变成一排,说50行同时...

$gen_query=$query; // keep $query as the stub 

while (($data = fgetcsv($handle)) !== FALSE) 
{ 
    $numlines++; 

    ... 
    $gen_query .="('$data[0]','$gga_date','$data[2]','$data[3]','$latitude','$data[5]','$longitude','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]','$data[12]','$data[13]','$data[14]', '$data[15]', '$data[16])',"; 
    if ($numlines % 50 == 0) { 
     mysql_query(substr($gen_query,0,-1)); 
     $gen_query=$query; 
    } 
} 
if ($gen_query!=$query) mysql_query(substr($gen_query,0,-1)); 
+0

所以你可以做这样的事情!我给它一个镜头,看看会发生什么。谢谢。 – ibiangalex 2010-11-11 14:04:37

+0

我应用了你的建议,但遇到了两个错误:$查询未定义,它说和mySQl语法错误,它说:“你的SQL语法有错误;查看与你的MySQL服务器版本对应的手册,在'1号线附近使用'可能是什么问题? – ibiangalex 2010-11-11 14:19:42

0

您还可以在php.ini中设置其他限制,例如最大帖子大小,最大上传大小等....但是,这个错误看起来像是由于其他原因。在读取上传的文件后,你是否正在构建真正的大对象[在PHP中,很可能是数组]?昨晚我有类似的问题,我所要做的就是增加我在php.ini中的内存限制。

当我之前遇到过这个问题没有增加内存限制的选项时,我不得不重写我的代码,以便这么多的对象不会同时存储在内存中。你可以发布一些代码吗?

+0

是的,我正在查询中用这种形式构造数组:$ query。=“( '$数据[0]', '$ gga​​_date', '$数据[2]', '$数据[3]', '$纬度', '$数据[5]', '$经度', '$数据[7]', '$数据[8]', '$数据[9]', '$数据[10]', '$数据[11]', '$数据[12]','$ data [13]','$ data [14]','$ data [15]','$ data [16])','; – ibiangalex 2010-11-11 13:02:30

+0

对不起,我如何发布你的代码?有些东西我从来没有真正用于格式化代码,例如跨内联的代码。我不太明白,但我在这里粘贴代码 – ibiangalex 2010-11-11 13:05:01

+0

编辑你的问题并在那里添加代码:-) – sjobe 2010-11-11 13:07:09