大模型文件读取并显示

sunmooner 2013-05-20 12:12:39
针对较大的工程模型文件(200M以上),读取之后需要存储有关的数据结构并进行显示。但由于生成的数据较多,结果超出了可用内存(bad_alloc)。请问应该如何处理这个问题?能否以临时文件的方式保存生成数据结构到外存,而又能顺利显示模型?如果可以,需要涉及哪些技术?希望大家能够提供思路,谢谢!
...全文
251 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-05-21
  • 打赏
  • 举报
回复
200M也算不小了,但是也不是很大,除非你的处理很占用内存,否则完全可以直接申请200M 内存,如果编译器开不了,可以直接调用API开出来。
有新工作否 2013-05-21
  • 打赏
  • 举报
回复
内存不够就添加内存呗,要是不买,右击"计算机"->"属性"->"高级系统设置"->"高级"->"性能"->"设置"->"高级"->"虚拟内存"->"更改",弄一个虚拟内存,就是有点慢,其他还好啦
sunmooner 2013-05-21
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
ps. 这个 32位 6G 内存怎么算出来的,32 位支持最大寻址空间为 4g,这 6g 是怎么来的?如果是说机器的物理内存是 6g 的话,那我想这 6g 里有 2g 系统压根就从来没用过,要是这样的话,升级成 64 位,先把这 2g 利用起来是最靠谱的方案了。
是插着6g的内存,但用了32位的系统,所以可用内存只有2.5g... 只是感觉如果程序只能用在64位系统上跑,比较受限
引用 10 楼 supermegaboy 的回复:
你误会了,内存映射文件并不是专用于大文件处理的,虽然它可以很好地处理大文件。当你遇到内存不够的时候,可以通过内存映射文件获取大量空间,当然比内存慢多了。
嗯,谢谢指教。我看了一下windows核心编程,里面写道: “与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,并将物理存储器提交 给该区域。它们之间的差别是,物理存储器来自一个已经位于磁盘上的文件,而不是系统的页 文件。一旦该文件被映射,就可以访问它,就像整个文件已经加载内存一样。” 谢谢各位的回复,我再考虑一下吧
飞天御剑流 2013-05-20
  • 打赏
  • 举报
回复
引用 楼主 sunmooner0 的回复:
针对较大的工程模型文件(200M以上),读取之后需要存储有关的数据结构并进行显示。但由于生成的数据较多,结果超出了可用内存(bad_alloc)。请问应该如何处理这个问题?能否以临时文件的方式保存生成数据结构到外存,而又能顺利显示模型?如果可以,需要涉及哪些技术?希望大家能够提供思路,谢谢!
可使用内存映射文件。
ri_aje 2013-05-20
  • 打赏
  • 举报
回复
楼主有没有算过,导致 bad_alloc 的那个文件,相关的数据结构到底需要占用多大的内存?
代码老猿 2013-05-20
  • 打赏
  • 举报
回复
可以的。把你的数据整理成便于显示的数据放在文件里。然后根据显示需要来交换数据。 还有就是可以自己建虚存系统。很多图形软件如PhotoShop就是这样做的。
飞天御剑流 2013-05-20
  • 打赏
  • 举报
回复
引用 7 楼 sunmooner0 的回复:
[quote=引用 3 楼 supermegaboy 的回复:] 可使用内存映射文件。
谢谢回复。请问使用内存映射文件跟虚拟内存的区别是什么呢? 查了一下,内存映射文件好像是读取特别大的文件(超出内存大小)的时候用的? 现在的问题其实不是读取文件的问题,而是将信息读取之后,要利用所读取的信息生成大量的附加数据,而这部分数据占用内存过大导致的,不知道对这个问题是否有帮助?[/quote] 你误会了,内存映射文件并不是专用于大文件处理的,虽然它可以很好地处理大文件。当你遇到内存不够的时候,可以通过内存映射文件获取大量空间,当然比内存慢多了。
ri_aje 2013-05-20
  • 打赏
  • 举报
回复
引用 6 楼 sunmooner0 的回复:
[quote=引用 2 楼 ri_aje 的回复:] 楼主有没有算过,导致 bad_alloc 的那个文件,相关的数据结构到底需要占用多大的内存?
如果是调用60多M的模型,要用到900M的内存。200M模型,根据查看资源管理器,程序大概在1.2G的时候死掉。应该是物理内存资源耗尽导致的。机器win 7 32位,6G,可用内存2.5G[/quote] 个人感觉增大内存是最好的解决方案,无论映射文件,还是虚拟内存,都是万变不离其宗的,即用磁盘空间模拟内存空间。这样的话,即便这些技术能够暂时解决内存分配的问题,估计程序运行起来后过度的磁盘读写还是会使其速度慢的无法忍受,程序基本还是没法用;而且根据我的经验,一旦硬盘忙起来的话,不光是你一个程序没反应的问题,基本上整个系统都琐死了,想 kill 程序都很费劲。 ps. 这个 32位 6G 内存怎么算出来的,32 位支持最大寻址空间为 4g,这 6g 是怎么来的?如果是说机器的物理内存是 6g 的话,那我想这 6g 里有 2g 系统压根就从来没用过,要是这样的话,升级成 64 位,先把这 2g 利用起来是最靠谱的方案了。
代码老猿 2013-05-20
  • 打赏
  • 举报
回复
引用 5 楼 sunmooner0 的回复:
[quote=引用 1 楼 u010750906 的回复:] 可以的。把你的数据整理成便于显示的数据放在文件里。然后根据显示需要来交换数据。 还有就是可以自己建虚存系统。很多图形软件如PhotoShop就是这样做的。
感谢回复! 虚存系统的建立复杂吗?有没有这方面的学习案例或者资料可以推荐呢?[/quote] 开源的例子不知道,你可以找找.原理很简单,做好了可能不容易. 自己的虚存系统就是用多个文件来保存你的内存数据.将暂时不用的数据放到文件里,要用的时候倒入内存.
sunmooner 2013-05-20
  • 打赏
  • 举报
回复
引用 3 楼 supermegaboy 的回复:
可使用内存映射文件。
谢谢回复。请问使用内存映射文件跟虚拟内存的区别是什么呢? 查了一下,内存映射文件好像是读取特别大的文件(超出内存大小)的时候用的? 现在的问题其实不是读取文件的问题,而是将信息读取之后,要利用所读取的信息生成大量的附加数据,而这部分数据占用内存过大导致的,不知道对这个问题是否有帮助?
sunmooner 2013-05-20
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
楼主有没有算过,导致 bad_alloc 的那个文件,相关的数据结构到底需要占用多大的内存?
如果是调用60多M的模型,要用到900M的内存。200M模型,根据查看资源管理器,程序大概在1.2G的时候死掉。应该是物理内存资源耗尽导致的。机器win 7 32位,6G,可用内存2.5G
sunmooner 2013-05-20
  • 打赏
  • 举报
回复
引用 1 楼 u010750906 的回复:
可以的。把你的数据整理成便于显示的数据放在文件里。然后根据显示需要来交换数据。 还有就是可以自己建虚存系统。很多图形软件如PhotoShop就是这样做的。
感谢回复! 虚存系统的建立复杂吗?有没有这方面的学习案例或者资料可以推荐呢?
赵4老师 2013-05-20
  • 打赏
  • 举报
回复
引用 3 楼 supermegaboy 的回复:
[quote=引用 楼主 sunmooner0 的回复:] 针对较大的工程模型文件(200M以上),读取之后需要存储有关的数据结构并进行显示。但由于生成的数据较多,结果超出了可用内存(bad_alloc)。请问应该如何处理这个问题?能否以临时文件的方式保存生成数据结构到外存,而又能顺利显示模型?如果可以,需要涉及哪些技术?希望大家能够提供思路,谢谢!
可使用内存映射文件。[/quote] File Mapping Functions The following functions are used with file mapping. CreateFileMapping FlushViewOfFile MapViewOfFile MapViewOfFileEx MapViewOfFileVlm OpenFileMapping UnmapViewOfFile UnmapViewOfFileVlm

64,318

社区成员

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

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