关于C++写文件性能的问题。

hei1046035362 2015-09-08 04:02:55
加精
最近在研究如何将网络上的数据流快速、高效的写入文件,就像交易所的数据,一条记录就几KB,但是一秒钟会有几十MB上百M的数据下来,写文件如果一条一条写的话,显然性能就降下来了,求个性能较高的写文件方法,最好偏内核的性能高,20分钟20个文件,每个文件大概250M。
...全文
1279 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
linfengc 2015-09-16
  • 打赏
  • 举报
回复
引用 14 楼 pgmsoul 的回复:
[quote=引用 1 楼 JiangWenjie2014 的回复:] 在硬件性能不能提升的前提下,提高性能的方法就是缓存,周期性的将批量数据写入文件,设一个超时时间和缓存的记录数量上限,两者中只要一个不满足就立即把所有缓存刷到文件。写文件可以用内存映射的方式,先创建一个250MB的文件,然后映射到内存。你可以先试试直接文件映射内存的方式,不考虑缓存,能不能达到要求,然后再考虑加缓存的方式。如果这些都不行的话,你可以考虑一下用数据库。
知道什么叫吃饱了撑的吗?你难道能比操作系统自己做的缓存更好?[/quote] 这个人肯定没写过程序, 或者,没写过好的程序,或者,只会纸上谈兵.
pgmsoul 2015-09-15
  • 打赏
  • 举报
回复
不知道楼主试没试,写入本身就有缓存,只要你不是频繁的刷到磁盘。 通常情况下,瓶颈就是硬盘的写入速度,其它不用管。 网络下来的数据,本身系统已经做了好几级的缓存了,你自己就不用再增加系统负担,弄不好反倒更慢。内存映像文件是一个方法,事实上,你怎么知道系统内部就没用内存映像文件?
pgmsoul 2015-09-15
  • 打赏
  • 举报
回复
引用 1 楼 JiangWenjie2014 的回复:
在硬件性能不能提升的前提下,提高性能的方法就是缓存,周期性的将批量数据写入文件,设一个超时时间和缓存的记录数量上限,两者中只要一个不满足就立即把所有缓存刷到文件。写文件可以用内存映射的方式,先创建一个250MB的文件,然后映射到内存。你可以先试试直接文件映射内存的方式,不考虑缓存,能不能达到要求,然后再考虑加缓存的方式。如果这些都不行的话,你可以考虑一下用数据库。
知道什么叫吃饱了撑的吗?你难道能比操作系统自己做的缓存更好?
wjlsmail 2015-09-14
  • 打赏
  • 举报
回复
内存映射文件
langche23 2015-09-13
  • 打赏
  • 举报
回复
宝龙哥 2015-09-12
  • 打赏
  • 举报
回复
最快的就是内存映射文件了,如果其不能满足要求,就只有升级硬件了
洗洗睡去 2015-09-12
  • 打赏
  • 举报
回复
都是牛人啊
afegaegea 2015-09-12
  • 打赏
  • 举报
回复
升级吧~~~~~~~~··
Evankaka 版主 2015-09-10
  • 打赏
  • 举报
回复
用内存映射,读文件时也一样,不管是几个G的文件都能解决。
mujiok2003 2015-09-10
  • 打赏
  • 举报
回复
先换快速硬盘。 性能还有问题再谈程序优化: CRT和内核都有缓存, 先直接用fwrite实现。 如果有问题, 再调整fwrite的缓冲。 如果还有问题, 在再自己实现缓冲+wrtie。 如果还不行, 再上内存映射,分布式等复杂技术。
linfengc 2015-09-10
  • 打赏
  • 举报
回复
1分钟写入250m太小case了. 如楼上所说,要先缓存, !!!并在缓存中将内容组织好(二进制格式就放在buffer里,文本格式就放到string或stringstream里), 过个几十秒write一次即可!!!
ztenv 版主 2015-09-09
  • 打赏
  • 举报
回复
1、可以试着增大缓存,周期性的写入 2、使用磁阵或专用的存储设备
jiqiang01234 2015-09-08
  • 打赏
  • 举报
回复
几十兆每秒,还达不到硬盘的上限,改进一下写入完全可以应付。如果到100MB/s,基本就到了机械硬盘的上限了,可以考虑换固态硬盘
bear234 2015-09-08
  • 打赏
  • 举报
回复
分布式系统 一秒几十MB还不用分布式系统么
赵4老师 2015-09-08
  • 打赏
  • 举报
回复
换固态硬盘。
JiangWenjie2014 2015-09-08
  • 打赏
  • 举报
回复
在硬件性能不能提升的前提下,提高性能的方法就是缓存,周期性的将批量数据写入文件,设一个超时时间和缓存的记录数量上限,两者中只要一个不满足就立即把所有缓存刷到文件。写文件可以用内存映射的方式,先创建一个250MB的文件,然后映射到内存。你可以先试试直接文件映射内存的方式,不考虑缓存,能不能达到要求,然后再考虑加缓存的方式。如果这些都不行的话,你可以考虑一下用数据库。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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