我想知道如何优化 openCV 中的数据结构(特别是 mat 类型),以便我能够利用内置内存/虚拟内存管理的操作系统。
有关完整上下文,请阅读问答 here - 但除此之外,情况可以总结为我有大量垫子*,我需要任意和快速访问它们。主要的复杂性是全部数据量远远超过可用的 RAM 量。
(*从概念上讲,数据是 3D 数组的递归定义的 3D 数组,但我们不要混淆了水!)
与其构建我自己的 LRU 缓存和耗费大量 RAM 且效率低下的“页面”寻址策略来访问它,我宁愿让操作系统为我做这件事。
我想我明白了这些概念,但是当涉及到实际的实现时,我却摇摆不定:
这是通用 C++ 考虑因素,还是我需要在 openCV 级别解决的问题?
是不是让数据的粒度接近(但不超过)4KB 这么简单? (4KB 动机参见解决方案 here)
最佳答案
Is this a generic C++ consideration, or something I need to address at the openCV level?
您只需分配和使用大量内存。 分页/虚拟内存的全部意义在于它是完全透明的。一切都变得极度慢,但继续工作。在交换空间 + RAM 不足之前,您不会获得 ENOMEM。
在普通的 Linux 系统上,您的普通交换分区应该非常小(低于 1GB),因此您可能需要 dd 一个交换文件,以及 mkswap/swapon 就可以了。确保交换文件仅对 root 具有读写权限。显然,每个主要操作系统都有自己的程序。
Is it as simple as making the granularity of the of data close to (but not over) 4KB? (see the solution here for the 4KB motivation)
如果您有指向其他数据的指针,请确保将它们放在一起。您希望所有小的“热”数据仅位于几个页面中,这样一个体面的 OS LRU 算法就不会调出页面。
如果您将热数据与冷数据混合在一起,它很容易被调出页面,甚至在最终数据的缓存未命中发生之前导致额外的页面文件往返。
正如 Yakk 所说,顺序访问模式会做得更好,因为磁盘 I/O 在多 block 读取方面做得更好。 (即使 SSD 具有更大块的更好吞吐量)。这也允许预取,允许一个 I/O 请求在前一个数据到达之前开始。最大化 I/O 吞吐量需要流水线请求。
尽可能设计您的算法以进行顺序访问。这在所有级别的内存中都是有利的,从分页一直到 L1 缓存。顺序访问甚至可以使用 vector 寄存器实现自动向量化。
Cache blocking (aka loop tiling)技术也适用于页面丢失。 Google 了解详细信息,但主要思想是对数据的子集执行算法的所有步骤,而不是在每个步骤中触及所有数据。然后,每条数据只需加载到缓存中一次,而不是算法的每个步骤一次。
将 DRAM 视为巨大虚拟地址空间的缓存。
How would the mat(s) actually be saved, accessed and represented on disk? (is this how memory-mapping is involved?)
Swap space / the pagefile is the backing store for your process's address space .所以是的,它与你通过 mmaping 分配内存时得到的非常相似。一个大文件而不是进行匿名分配。
关于c++ - 优化数据结构,以便它们利用虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36707143/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD