QIODevice连续写入大量数据后产生“内存碎片”和“内存泄漏”问题

sumkee911 2015-05-03 09:01:13
我在编写一个服务器 利用QFile向硬盘写入服务器的log 和 利用QTcpSocket向大约两百个客户传送大量数据时,发现只要数据量一大,就开始产生内存碎片,经过我再三检查,发现是问题是出现在QFile和QTcpSocket在写入的时候。顺带一提,这两项功能都不是在主线程的。向请教各位同学有什么好的解决方法?万分感激!!

×××这个是写入log的


×××这个是写入socket的
...全文
904 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumkee911 2015-05-06
  • 打赏
  • 举报
回复
問題已經完美解決!!!還是按照老師的方法!!!自己定義一個門限!
sumkee911 2015-05-05
  • 打赏
  • 举报
回复
引用 1 楼 foruok 的回复:
QIODevice(QTcpSocket是QIODevice的子类)有内部缓冲区,如果不设置固定大小,会根据你要写入的数据,不断地重新分配内存。你可以自己设置一个门限,比如512K,每次写入前调用一下bytesToWrite(),看看剩余未写入数据有多少,如果接近你设置的门限,就等下一轮再调用write,这样可以避免内存碎片。
谢谢foruok老师的回答,我发现了一个非常奇怪的原因,我把socket放在了另外一个线程,每次写入数据都用了emit调用(Qt::QueueConnection),一emit多次它的内存就急增,只要不用emit就可以解决掉问题。请老师指点。
sumkee911 2015-05-04
  • 打赏
  • 举报
回复
foruok老師,我试了你建议的方法,但是还会产生内存碎片,不知道是否我的实现的方法错了,我实现的方法是将缓冲区饱和后(32KB)写入的数据先写入m_sendBuffer,还设置了一个timer每秒检查m_sendBuffer是否还有数据,如果存在数据而且缓冲区未满,就把数据写入。请指点
foruok 2015-05-04
  • 打赏
  • 举报
回复
QIODevice(QTcpSocket是QIODevice的子类)有内部缓冲区,如果不设置固定大小,会根据你要写入的数据,不断地重新分配内存。你可以自己设置一个门限,比如512K,每次写入前调用一下bytesToWrite(),看看剩余未写入数据有多少,如果接近你设置的门限,就等下一轮再调用write,这样可以避免内存碎片。

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧