具体来说,在node-opencv中,opencv Matrix对象表示为包装c ++ opencv Matrix的javascript对象。
但是,如果你不手动发送它们,那么V8引擎似乎不知道它们有多大,并且NodeJS内存占用量可能远远超出你试图在命令上设置的任何限制线;即它只是在接近设定的内存限制时似乎只运行GC,但由于它没有看到对象那么大,所以直到它太晚才会发生。
我们可以添加一些东西,让V8将它们视为大对象吗?
说明这一点,你可以创造并忘记' nodejs上的大型1M缓冲区设置为将其内存限制为256Mbytes。
但是如果你对1M opencv Matrices做同样的事情,NodeJS会快速使用超过256M的限制 - 除非你手动运行GC,或者手动释放矩阵。
(警告:c ++ opencv矩阵是对内存的引用;即多个Matrix对象可以指向相同的数据 - 但是让V8看到对同一内存的所有引用的大小都是一个开始为了GC的目的,那个内存更安全,看起来非常小。)
情况:在RPi3上,我们的内存占用有限,处理实时视频(每帧使用大约4M的mat对象)很快就会耗尽所有内存。 此外,我工作的环境(节点 - 红色节点)是为公共场所设计的。使用,所以很难确保所有用户完全理解需要手动.release()图像;因此,这个问题是关于如何将这些大数据置于GC的控制之下。
答案 0 :(得分:0)
您可以使用AdjustAmountOfExternalAllocatedMemory(int64_t delta)
告知v8您的外部存储器使用情况。 n-api和NAN中有此功能的包装。
顺便说一句,“大对象”在v8中具有特殊含义:大到足以在大对象空间中创建且永不移动的对象。外部存储器是堆外存储器,我想您在指的是什么。