php pdo 内存泄露,php – PDO/MySQL内存消耗与大结果集

我有一个奇怪的时间处理从大约30,000行的表中选择。

看起来我的脚本使用了一个非常大量的内存,这是一个简单的,向前转的查询结果。

请注意,这个例子是一个有点设计,绝对的最低限度的例子,它与真正的代码非常相似,它不能被简单的数据库聚合替换。它旨在说明每一行不需要在每次迭代中保留的一点。

$pdo = new PDO('mysql:host=127.0.0.1', 'foo', 'bar', array(

PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,

));

$stmt = $pdo->prepare('SELECT * FROM round');

$stmt->execute();

function do_stuff($row) {}

$c = 0;

while ($row = $stmt->fetch()) {

// do something with the object that doesn't involve keeping

// it around and can't be done in SQL

do_stuff($row);

$row = null;

++$c;

}

var_dump($c);

var_dump(memory_get_usage());

var_dump(memory_get_peak_usage());

输出:

int(39508)

int(43005064)

int(43018120)

我不明白为什么在任何时候几乎没有任何数据需要使用40兆的内存。我已经计算出来,我可以通过将“SELECT *”替换为“SELECT home”,将“SELECT *”替换为“6”,从而将内存减少到6倍,但是我认为即使这种使用情况非常高,表只会变大。

有没有我缺少的设置,还是PDO有一些我应该注意的限制?我很高兴摆脱PDO赞成mysqli,如果它不能支持这一点,所以如果这是我唯一的选择,我该如何使用mysqli来执行这个?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值