如何提高读写效率?

huangzhtao 2011-04-20 10:50:41
主要是关于C++中fstream文件读写问题:
在程序中,要写入一系列图像,图像的每个像素以自定义的RGB结构体存储,然后写入文件中,使用了如下代码:
fs.write((char *)(&rgbMap), sizeof(rgb_Pixel_C8)*RGB_WIDTH*RGB_HEIGHT);

fs是fstream,用二进制模式;rgbMap是图形存储的结构指针。
程序主要实现的目的是将一系列RGB图像保存到文件中去,RGB图形从摄像头段采集出来,每秒大概60帧的样子,需要将该图像转换到自定定义的RGB结构体中,然后写入文件,图像大小为1024×758或者更大。
目前想要请教的是这几个问题:
1. 采取堵一帧写一帧的方法,数据量还比较大,效率上可能有点低,有没有其他方法能够提高写的效率?
2. 写入文件的图形序列还需要读取出来,有没有什么方法能够尽可能提高效率?

有任何建议的,请不吝赐教,多谢!
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangzhtao 2011-04-25
  • 打赏
  • 举报
回复
多谢lucifer,结贴给分了。
luciferisnotsatan 2011-04-21
  • 打赏
  • 举报
回复
读写的优化上面都说了,说点别的吧

你可以用多线程
一个负责读,读完一帧后,通知做处理的线程。然后继续读下一帧。
处理线程接到通知后,去处理图片。处理完后,通知写的线程去写数据。

写入文件的图形序列还需要读取出来如果内存够大的话,可以在内存里开个缓存(如队列)把写入的的序列先放到缓存里。如果后面要用到,先查缓存里是否有,没有再去读。
huangzhtao 2011-04-21
  • 打赏
  • 举报
回复
多谢各位!
to hongwenjun:内存映射确实是提高效率的一个方法。
to pathuang68:笔误,是768。然后你说的问题确实有道理,昨天没有做细的测试,如果采用了常用的提高效率的方法后,该标准不能达到的话,只能降低图像质量和帧率了。
to Loaden:fstream最后也是调用WindowsAPI的,确实效率不如直接使用API函数的。

还有其他建议吗?
老邓 2011-04-20
  • 打赏
  • 举报
回复
fstream的效率比较低。
建议用API:CreateFile
HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);

内存映射可能不太适用:因为不断读写,文件大小一直在变化。
pathuang68 2011-04-20
  • 打赏
  • 举报
回复
图像大小如果为1024×758(应该是768吧?)或者更大,以目前的比较好的机器,帧率也不可能达到60FPS,楼主是不是搞错了?

理由如下(每个像素有3bytes的RGB值):
1秒钟要存储的数据:
1024 * 768 * 3 * 60 = 141557760bytes = 135MB

而7200rps的硬盘的写入速度也就是40~70MB/s
hongwenjun 2011-04-20
  • 打赏
  • 举报
回复
windows 编程的 内存映射,具体要查书了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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