我有以下设置:
我想从表中选择所有内容,这应该没问题:
$table = new Application_Model_DbTable_Foo();
$everything = $table->fetchAll();
这样做我遇到了“内存耗尽”的问题。
我在没有Zend Framework的情况下使用PDO_MYSQL编写了一个脚本,内存使用情况很好,而且工作正常。
所以我必须在这里遗漏一些东西。任何提示高度赞赏。 : - )
答案 0 :(得分:2)
单独22k行可以获得大量数据,具体取决于脚本的运行情况。如果无法增加内存限制,则可能需要尝试此操作。抓住行的“大块”。您可以使用LIMIT
执行此操作。将页面大小设置为适合内存的内容,然后进行处理。继续增加OFFSET
,直到处理完所有数据为止。
答案 1 :(得分:2)
Thanx,大家,看看我的问题。 : - )
如需进一步参考,如果其他人有这个问题,我最终会这样:
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$result = $db->query("SELECT * from footable");
foreach ($result as $row) {
//print $row["field"];
}
unset($result);
...仍在考虑切换到“使用LIMIT x,y获取它”-suggestion。
答案 2 :(得分:1)
当我参与Zend Framework项目时(直到ZF 1.0),我在Zend_Db组件上工作了很多。
正如@netcoder所说,Zend_Db_Table组件为每个提取的行创建对象。对象比原始数组占用更多内存,但它们也为您提供了使用OO用法和save()
等的机会。
真正的麻烦在于您在大型数据集上执行fetchAll()
。即使你的内存限制可以处理22000行,明天你将需要44000行,下个月需要100000行。
无论Zend_Db实现如何,或者如果您使用没有框架的PDO,您需要学习管理大型数据集而不将它们完全加载到内存中,因为这将不可避免地导致内存耗尽。对于任何库或框架甚至任何语言都是如此。
您可以尝试使用@ {1}} @Chris Henry建议,因此您一定要获取不太多的固定数量的行。
或者,您可以一次获取一行数据,因此内存中只有一行。 Zend_Db_Table类没有提供执行此操作的方法;您必须使用Zend_Db_Adapter接口自行运行SQL查询,然后使用LIMIT
循环结果。
请参阅http://framework.zend.com/manual/en/zend.db.statement.html
上的示例答案 3 :(得分:0)
Zend_Db使用了很多抽象,类等。对于结果集中的每一行,它都会创建一个对象(Zend_Db_Table_Row)。每行的对象使用的内存比具有键值对的数组更多。