jjzjj

c++ - 进程外内存堆可在32位地址空间内工作

coder 2024-02-24 原文

问题:大型模拟游戏中有许多荒谬的不同对象,必须对其进行跟踪,更新并用于视觉渲染和逻辑模型更新。仅4 GB的地址空间,您就只能在内存中容纳这么多东西。如果您求助于磁盘,除非运气好并且不断访问页面缓存,否则事情会开始放慢速度。但是即使那样,当文件系统同步到磁盘时,进行大量更新/写入也将是昂贵的。

假设用户至少有32GB的RAM(少数报告有64GB),并且希望进行巨大的模拟,从而导致该模型所承载的数据量比游戏中要处理的大多数事物都要多一个数量级。它们当然具有64位操作系统(例如Windows 7 x64或Windows 8 x64)。自然地,如果仅将所有这些模型数据存储在进程中的虚拟地址空间中,即使使用大型地址感知,即使主机具有千兆字节和几千兆字节的可用RAM,也会遇到内存不足的情况(因为32位进程不在虚拟地址空间(VAS)中。

我们还假设,出于完全无法控制的原因,您不能使主二进制文件成为64位。您依赖于某些专有框架,花费了可笑的工时来对该框架进行编码,并且必须从第一方开始重新过渡到其他框架。您的框架仅提供32位版本,因此您陷入了困境。

正确的?

可能是。

我有一个随机的想法,似乎很远,因为我不知道我是否可以使它高效或实用。

如果我可以创建一个64位子进程,那么它就可以用于所有实际用途,甚至可以在非常高端的服务器机箱上使用尽可能多的RAM,而今天的任何人都可以购买并插入主板。

现在,我希望能够从模型中高效地存储和检索大数据,并将其插入子流程中,并不时获取该数据的子部分复制到子流程中。因此,基本上,所有容量的千兆字节(一系列非常大的树状结构和哈希表状结构)中的“主要”模型都将位于64位进程中,而32位进程将在其中窥视,大量数据,进行处理(或者也许我应该让子进程在其中进行一些处理以将其提取下来?),然后将其删除-以使内存使用率在32位进程中可管理。

所有模型读取/变异/模拟算法均基于以下假设:模型可在本地在进程中使用,因此诸如随机数组访问之类的事情很普遍。对于我来说,很难从主要模型中提取出一些基于块的顺序读取的访问模式,而且遍历整个模型也不是很不常见。

我的目标是:

  • 防止织补物因内存不足而崩溃(目标1)
  • 性能(非常接近#2,但是使用极端复杂性的人可能会比模拟更小,更简单的游戏的人接受更差的性能)
  • 对现有代码的最小重构(或多或少具有渲染调用和多线程功能的 Vanilla C++)

  • 从相干内存模型到必须通过孔径仔细查看比我在任何时候都无法把握的更大的模型,这似乎是一个非常艰巨的项目,这可能需要重新设计许多算法。

    我的问题:
  • 有这样做的先例吗?
  • 在Windows上如何最好地做到这一点?是否有某种共享内存(例如在Linux上)或轻量级的超高带宽随机内存访问IPC,可以通过operator[]()实现将其集成到C++中?
  • 是否任何IPC的性能都会这么差,甚至不值得尝试?我是否应该仅依靠磁盘(您知道数据库,键值之类的东西),然后让操作系统/文件系统找出如何使用RAM?

  • 请记住,我需要一种极其“闲谈”的IPC机制的支持,因为许多处理算法(AI等)都是围绕小内存访问和更新而设计的。这在进程中已经足够好了,甚至对缓存局部性都有一定的关注,但是当您通过IPC访问它时,一切都变得很奇怪。

    最佳答案

    我的情况与您类似,GUI是32位的,但需要x64代码才能与系统接口(interface)。我们采用的方法是使用 WM_COPYDATA 并在魔术过程位边界之间来回传递数据。自然,它不如使用dll快,但这不是一种选择。在我们的用例中,性能折衷是可以接受的。

    关于c++ - 进程外内存堆可在32位地址空间内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16028361/

    有关c++ - 进程外内存堆可在32位地址空间内工作的更多相关文章

    1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

      在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

    6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

      我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

    7. ruby - 通过 ruby​​ 进程共享变量 - 2

      我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

    8. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

      关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

    9. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

      在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

    10. ruby-on-rails - Ruby 中的内存模型 - 2

      ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

    随机推荐