2014-09-05 78 views
0

我的情况是这样的,我有处理大量结果集的PHP

$data = $somearray; //say the number of records in this array is 200000 

IAM循环这个数据,处理一些功能和写这个数据到Excel中的一个巨大的数据集从MySQL表提取文件​​

$my_file = 'somefile.csv'; 
$handle = fopen($my_file, 'w') or die('Cannot open file: ' . $my_file); file 
    for($i=0;$i<count($data);$i++){ 
     //do something with the data 
     self::someOtherFunctionalities($data[$i]); //just some function  
     fwrite($handle, $data[$i]['index']); //here iam writing this data to a file 
     } 
fclose($handle); 

我的问题是,循环获取内存耗尽......它显示“的致命错误,允许内存大小..”反正是有处理这个循环没有枯竭

由于服务器限制IM无法提高PHP内存限制像

ini_set("memory_limit","2048M"); 

我不是关注它takes..even的时间,如果它需要hours..so我做set_time_limit(0)

+0

难道你不能在批处理中读取MySQL数据,还是按行逐行处理,而不是将整个集合保存到变量中? – Prix 2014-09-05 08:30:18

+0

我也尝试过批处理......但它仍然挂起......有没有办法我们可以在每个循环结束时释放内存 – coolguy 2014-09-05 08:33:34

+0

要释放内存只需将变量设置为null,垃圾收集器应该处理记忆。 – 2014-09-05 08:35:29

回答

1

如果您不必担心时间,一次取1000行,并将行附加到文件的末尾,例如。创建一个临时文件,在作业完成后移动和/或重命名。

First select count(*) from table 
    then for($i = 0; i < number of row; i = i + 1000){ 
    result = SELECT * FROM table LIMIT i,1000; # Retrieve rows 6-15 
    append to file = result 
} 
move and rename the file 

这是柠元的代码,但这个过程应该工作

+0

查询需要'order by',否则不能保证它会选择下一批。它还假定数据不会改变。 – Marek 2014-09-05 08:57:57

+0

随意使用编辑按钮来改进我的建议,正如我所说的,它只是一个列表形式,而不是一个工作示例。 – 2014-09-05 09:01:33

2

你能在你的MySQL查询中使用“限制”?

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(除了使用预准备语句时)。

使用两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):

SELECT * FROM tbl LIMIT 5,10; #检索行6-15

http://dev.mysql.com/doc/refman/5.0/en/select.html

5

你的工作是线性的,你不需要加载所有数据。如果将此文件发送给httpClient,则使用Unbuffered Query也使用php://stdout(不要临时文件)。

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); 
$my_file = 'somefile.csv'; // php://stdout 
$handle = fopen($my_file, 'w') or die('Cannot open file: ' . $my_file); file 

if ($uresult) { 
    while ($row = $uresult->fetch_assoc()) { 
    // $row=$data[i] 
     self::someOtherFunctionalities($row); //just some function  
    fwrite($handle, $row['index']); //here iam writing this data to a file 
    } 
} 
$uresult->close(); 
?>