C++怎样消耗最小内存读大文件(存放在CString中)

founder0127 2017-12-18 05:21:52
需求:读一个大小为300兆的文件,并将内容放在CString类型的变量buff中。
前述:FioFile.Open( filename, CFile::modeRead|CFile::shareDenyWrite , &Error ) 打开文件

方案1:
CString temp;
while(FioFile.ReadString(temp))
{
buff = buff + temp;
}
这个方法只需要消耗300兆的内存,但是文件太大时太耗时间(二十多兆的文件估计就得读好几个小时),所以该方案丢弃

方案2:
char*allstr=(char *)((void *)new char[300 * 1024 * 1024]);
while(FioFile.ReadString(temp))
{
strcpy( allstr + idx, temp.GetBuffer( temp.GetLength() ));
temp.ReleaseBuffer();
}
buff = allstr ;
但是在最后一步“buff = allstr;”时,需要消耗两个连续的300M的空间,也就是600兆的空间,如果不存在连续的两个300兆的空间,则会出现内存不足的情况,舍弃

方案3:
结合方案1和2,开辟50兆大小的char*,每次读取50兆,拼接在buff上,但是拼接到最后一次250兆时,如果这时CString的空间不是一个大于300兆的连续空间,那么系统会重新找一个有300兆的连续空间,那么消耗的内存情况就是50兆的char*空间+250兆的连续空间+300兆的连续空间,没有这些连续空间,也会报出内存不足。

请教一下,怎么样才能只消耗最小的空间读取文件?
我本来的想法是,使用方案三,最开始就给buff开辟一个300兆的空间,但是没找到给CString类型指定空间大小的方法
...全文
434 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2017-12-19
  • 打赏
  • 举报
回复
大一点的文件不都是文件内存映射?
自信男孩 2017-12-19
  • 打赏
  • 举报
回复
建议使用动态申请,new/delete,根据需要申请一定大小的空间。 其实也要考虑读取这么大的文件内容做什么?比如如果是从一个文件里读然后写到另一个文件里,没必要申请这么大的内存。如果是从文件里读到数据,然后处理,可以考虑边读边处理,这样如果有重复的数据,就可以不申请那么大的空间了。如果必须先读到内存,建议是用new/delete申请空间。根据变量在内存里的空间大小:栈<全局内存<堆 (new/delete)
真相重于对错 2017-12-18
  • 打赏
  • 举报
回复
300兆文件,那么慢, 你还是换台机器吧!
赵4老师 2017-12-18
  • 打赏
  • 举报
回复
paschen 2017-12-18
  • 打赏
  • 举报
回复
试下文件内存映射,操作系统直接将文件内容映射到内存,你再执行你需要的操作
founder0127 2017-12-18
  • 打赏
  • 举报
回复
有没有人来帮帮我啊

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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