c – 将std :: vector截断为长度N的有效方法 – 释放内存
作者:互联网
我有几个chad的大型std ::向量(从二进制文件加载的字节).
当我的程序内存不足时,我需要能够剔除这些向量使用的一些内存.这些向量几乎是我内存使用的全部内容,它们只是本地和网络文件的缓存,所以只抓住最大的一个并将其切成两半左右是安全的.
唯一的问题是,我目前正在使用vector :: resize和vector :: shrink_to_fit,但这似乎需要更多的内存(我想要重新分配新的大小)然后是一堆时间(用于破坏现在被破坏的)指针,我认为是免费的?)然后将剩余的复制到新的向量.请注意,这是在Windows平台上,在调试中,因此指针可能不会在发布版本或其他平台上销毁.
有什么我可以做的就是说“C,请告诉操作系统我不再需要在此向量中位于过去位置N的内存”?
或者,是否有另一个容器我最好使用?我确实需要随机访问,或者努力设计一种方法来轻松地将迭代器指向我接下来想要阅读的地方,这是可能的,只是不容易,所以我不想使用std ::名单.
解决方法:
resize和shrink_to_fit是你最好的赌注,只要我们谈论标准C,但是这些,正如你所注意到的那样,如果你处于低内存状态,可能根本没有帮助:因为分配器接口不提供realloc类似操作,向量被强制分配一个新块,复制其中的数据并解除分配旧块.
现在,我看到基本上有四种简单方法:
>删除整个向量,而不仅仅是它们的一部分,可能使用LRU或类似的东西;使用大向量时,C分配器通常只是转发到操作系统的内存管理调用,因此内存应该直接返回操作系统;
>编写自己的容器,使用malloc / realloc或特定于操作系统的功能;
>使用std :: deque代替;你会失去有保证的数据连续性,但是,由于deques通常会为不同的块中的数据分配空间,所以执行调整大小shrink_to_fit应该非常便宜 – 只需在末尾释放所有未使用的块,而无需大量重新分配;
>把这份工作留给操作系统.正如评论中已经说明的那样,操作系统已经有了文件缓存,在正常情况下它可以比你或我更好地处理它,即使只是因为它可以更好地了解物理内存的剩余量,哪些文件对于大多数应用程序来说都是“热门”,等等.此外,由于您在虚拟地址空间中工作,您甚至无法保证您的内存实际上将保留在RAM中;当机器进入内存压力并且你不经常使用某些内存页时,它们会被交换到磁盘,所以你的所有性能提升都会丢失(并且你已经找到的东西在页面文件上浪费了空间在磁盘上).
另一种方法可能是使用内存映射文件 – 系统将照常执行自己的缓存,但只要文件保留在内存中,就可以避免任何系统调用开销.
标签:c,vector,windows,stl,stdvector 来源: https://codeday.me/bug/20190825/1714089.html