繁体   English   中英

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

[英]Zend Framework, pdo_mysql and problems with memory limit - Why?

我有以下设置:

  • 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编写了一个脚本,内存使用情况很好,而且工作正常。

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

单独22k行可以获得大量数据,具体取决于脚本的运行情况。 如果无法增加内存限制,则可能需要尝试此操作。 抓住行的“大块”。 你可以用LIMIT做到这一点。 将页面大小设置为适合内存的内容,然后进行处理。 继续增加OFFSET直到处理OFFSET所有数据为止。

各位大家,看看我的问题。 :-)

如需进一步参考,如果其他人有这个问题,我最终会这样:

 $db = Zend_Db_Table_Abstract::getDefaultAdapter();
   $result = $db->query("SELECT * from footable");
   foreach ($result as $row) {            
           //print $row["field"]; 
  }
  unset($result);

...仍在考虑切换到“使用LIMIT x,y获取它” - 建议。

当我在Zend Framework项目上时(直到ZF 1.0),我在Zend_Db组件上工作了很多。

正如@netcoder所说,Zend_Db_Table组件为每个提取的行创建对象。 对象比原始数组占用更多内存,但它们也为您提供了使用OO用法和save()等的机会。

真正的麻烦是你在大型数据集上做fetchAll() 即使你的内存限制可以处理22000行,明天你将需要44000行,下个月需要100000行。

无论Zend_Db实现如何,或者如果您使用没有框架的PDO,您都需要学习管理大型数据集而不将它们完全加载到内存中,因为这将不可避免地导致内存耗尽。 对于任何库或框架甚至任何语言都是如此。

您可以尝试使用LIMIT因为@Chris Henry建议,所以您一定要获取不太多的固定数量的行。

或者,您可以一次一行地获取数据,因此内存中只有一行。 Zend_Db_Table类没有提供执行此操作的方法; 您必须使用Zend_Db_Adapter接口自行运行SQL查询,然后使用fetch()循环结果。

请参阅http://framework.zend.com/manual/en/zend.db.statement.html上的示例

Zend_Db使用了很多抽象,类等。对于结果集中的每一行,它创建一个对象(Zend_Db_Table_Row)。 每行的对象使用比具有键值对的数组更多的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM