您好,匿名用户
随意问技术百科期待您的加入

symfony propel doselect 内存溢出怎么办?

0 投票

symfony propel doselect时,由于一次性拿出的数据太大,导致内存溢出怎么办?

用户头像 提问 2012年 12月1日 @ Diana 上等兵 (326 威望)
分享到:

1个回答

0 投票
 
最佳答案

用doSelect,会把所有行一次性取出来扔到内存里,如果你的结果集比较大,自然会炸;你可以用逐行操作来控制内存峰值:

/* 方法1.a */
$stmt = YourPeer::doSelectStmt($criteria); // <= 预处理
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 逐行操作$row
}

/* 方法1.b */
$rs = YourPeer::doSelectRS($criteria); // <= 取回一个打了包装的结果集
$rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);
while($rs->next()) {
    $row = $rs->getRow();
    // 逐行操作$row
}

还有一些不治标的偷懒办法:

/* 方法2:如果不需要把数据结果映射成对象,可以只获取指定的字段;不映射成对象,也能省内存 */
$criteria = new Criteria();
$criteria->clearSelectColumns()->addSelectColumn(YourPeer::COL_NAME);
// 然后⋯⋯

/* 方法3:在php.ini里增大PHP运行内存限制 */
memory_limit = 1111M
用户头像 回复 2012年 12月1日 @ Kennen 上等兵 (442 威望)
选中 2012年 12月1日 @Diana
提一个问题:

相关问题

0 投票
1 回复 30 阅读
用户头像 提问 2012年 12月1日 @ Vladimir 上等兵 (275 威望)
0 投票
1 回复 37 阅读
0 投票
1 回复 74 阅读
0 投票
1 回复 53 阅读
用户头像 提问 2012年 12月1日 @ Vergil 上等兵 (384 威望)
0 投票
1 回复 72 阅读
用户头像 提问 2012年 12月1日 @ Swain 上等兵 (232 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...