PHP的海量内存使用SQL查询

我已经偶然发现了一个奇怪的问题,同时优化了我的Apache + PHP内存使用情况。 基本上,当试图绑定MysqLi查询的结果时,错误消息“致命错误:16777216字节的允许内存大小已耗尽(尝试分配50331646字节)”代码爆炸。

相关的表格是:

CREATE TABLE `note` ( `noteID` int(11) NOT NULL AUTO_INCREMENT,`contentID` int(11) NOT NULL,`text` mediumtext NOT NULL,PRIMARY KEY (`noteID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `content` ( `contentID` int(11) NOT NULL AUTO_INCREMENT,`text` varchar(2048) NOT NULL,`datestamp` datetime NOT NULL,PRIMARY KEY (`contentID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

而这个查询就是:

select content.contentID,content.text,content.datestamp,note.noteID,note.contentID,note.text from basereality.content as content inner join basereality.note as note on content.contentID = note.contentID where content.contentID = 1028 ;

在服务器上运行MysqL中的查询运行正常,并且返回的'note'的大小小于千字节。

在两个进程(C,Windows)之间共享内存

哪个进程正在使用我的记忆?

如何避免物理磁盘I / O

提升mmap性能与原生内存映射

Java内存不足错误(本机内存),进程大小限制被击中(32位Linux)

一个奇怪的是,它正试图分配的大小50331646是hex0x2FFFFFE这是一个可疑的整数。 这几乎就像PHP试图分配一个足够大的缓冲区来容纳最大的中文字段,而不是实际为检索到的数据分配内存。

任何人都知道这个解决方法 – 除了增加PHP允许的最大内存?

顺便说一句其他人有同样的问题,但似乎并不知道如何解决它。 内存不足(分配了50855936)(试图分配50331646字节)

爆炸的确切路线是:

$statement->bind_result( $content_contentID,$content_text,$content_datestamp,$note_noteID,$note_contentID,$note_text);

更改查询以select“'作为注释的testingstring”,而不是获取列不再显示大量的内存使用情况。

顺便说一句,我相信,我不是试图检索大数据。 这显示了注释表中的中文字段的实际长度:

select length(text) from basereality.note; +--------------+ | length(text) | +--------------+ | 938 | | 141 | | 1116 | | 431 | | 334 | +--------------+

如何确定Windows中进程的内存布局?

高级内存编辑/函数调用

C ++内存debugging器?

/ proc / slabinfo给了什么信息?

为什么Linux中的物理内存被分配线性增加而不是一次?

我找到了答案,并在另一个问题上评论道:

用尽了67108864个字节的内存大小

基本上,在旧的MysqL连接器库中,而不是仅仅分配字段“文本”的实际大小来存储结果,而是分配类型mediumtext的最大可能大小。

即,即使结果的字段仅为100千字节,也总是分配16兆字节。

解决这个问题的最简单也可能是最好的方法是切换到使用不显示此行为的新MysqLND连接器。

你有没有试过MysqLi_store_result? 看看下面的PHP.net链接,更多的人有相同的问题,有些解决它与绑定结果之前调用store_result。

http://PHP.net/manual/en/MysqLi.store-result.PHP

http://dev.MysqL.com/doc/refman/5.0/en/MysqL-stmt-store-result.html

相关文章

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持S...
为进一步规范小程序交易生态、提升用户购物体验、满足用户在...
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和...
内部类(当作类中的一个普通成员变量,只不过此成员变量是cl...