Zend Framework,pdo_mysql和内存限制问题 - 为什么?

时间:2010-11-05 19:55:30

标签: php mysql zend-framework pdo zend-db

我有以下设置:

  • Zend Framework 1.10.8
  • 数据库适配器:pdo_mysql
  • 内存限制:128MB
  • 表格类型:myisam
  • 表格大小:4 MB
  • 记录数:22.000
  • 列数:aprox。 70

我想从表中选择所有内容,这应该没问题:

$table = new Application_Model_DbTable_Foo();
$everything = $table->fetchAll();

这样做我遇到了“内存耗尽”的问题。

我在没有Zend Framework的情况下使用PDO_MYSQL编写了一个脚本,内存使用情况很好,而且工作正常。

所以我必须在这里遗漏一些东西。任何提示高度赞赏。 : - )

4 个答案:

答案 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)。每行的对象使用的内存比具有键值对的数组更多。