gpt4 book ai didi

mysql - CakePHP 的内存分配问题

转载 作者:行者123 更新时间:2023-11-30 23:19:38 26 4
gpt4 key购买 nike

我仍然对 Cake 的内存使用有疑问。我阅读了很多威胁并尝试了 1000 种东西,但没有任何帮助。我使用 CakePHP 2.4.x。使用 MySQLdB。我编写了一个 API 来从数据库中选择日志数据。我做了一个测试来解释是什么让我如此困惑。我有一个选择,它返回 1400 行 11 列。我的一般内存使用量(使用 memory_get_usage)约为 4MB。在我选择之后:

$condition = array('conditions'=> array(


'LogBackend.created_at between ? AND ?' => array(
$this->params['url']['from'],$this->params['url']['to']
)));

$this->data = $this->LogBackend->find('all', $condition).

我的内存使用量激增至 9MB 以上。仍然没有返回,也没有对数据进行任何处理。只是选择。好吧,9MB 并不算多,但如果我选择更多,大约 10 万行应该是可能的。我的 256MB 空间用完了。任何人都可以告诉我这种荒谬的内存使用的原因吗?

最好的问候

最佳答案

只需改用分页,并分块处理您的数据。 Cake 面向一个 View 的 20 行左右的 block 。但通常我们希望生成基于数百万行的报告。 CakePhp 有一个名为 paginate 的函数,可以诱使它非常有效地执行 mysql LIMIT 100000,1000。我通过谷歌搜索发现了这些 hack,Cakephp 1.3 的语法略有不同,如果没有人发布关于 Cake 3 的信息,并且它发生了变化,我可能有一天会回来发布。

// cakephp 2.4.1
$condition = array('conditions'=>
array('LogBackend.created_at between ? AND ?' =>
array($this->params['url']['from'],$this->params['url']['to'])));

$this->paginate['conditions'] = $conditions['conditions'];
$this->paginate['limit'] = 1000;
// could also use ['fields'] = array('filed1', 'field2'); to limit memory

/******* here is where we trick paginate to iter in the ctrlr *****/
$this->request->params['named']['page']=1;
$this->request->params['paging']['ModelName']['nextPage'] = true;
// get chunks
while ($this->request->params['paging']['ModelName']['nextPage']) {
$Rows = $this->paginate("ModelName");
// boil down this chunk of data
$this->request->params['named']['page']+=1;
}

将数百万行传回 View 没有意义。 while 循环每次都会覆盖 $Rows,重新使用该核心内存。因此,挑战在于找到一种巧妙的方法来提取数据,或者在循环期间编写一个新表以用于下一次优化。由于模型处理开销,Cakephp 上的执行速度仍然较慢,因此如果有很多不需要的列,请使用 paginate['fields'] 仅处理您需要的字段。字段与列相同。

PHP 在哲学上确实与 Apache 紧密相连,所以它真的不是为这种事情而设计的。它旨在在 30 秒或更短时间内获得结果并呈现网页。这不仅仅是蛋糕的责任。 Python 和 Ruby 可能更好,甚至是 Perl。但是,当您必须筛选工具以在 html 中进行格式化时,您会哭得像个婴儿。

关于mysql - CakePHP 的内存分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com