84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
symfony propel doselect时,由于一次性拿出的数据太大,导致内存溢出怎么办?
用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
用doSelect,会把所有行一次性取出来扔到内存里,如果你的结果集比较大,自然会炸;你可以用逐行操作来控制内存峰值:
还有一些不治标的偷懒办法: