问题标签 [memory-pool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何完全管理像map这样的std容器的堆内存分配?
我对使用多个 std map<int,int> 很感兴趣,我希望它们都从一个公共内存池中分配元素。从我目前所读的内容来看,我可以使用自定义分配器(例如 Boost pool_alloc)来实现这一点。
我的问题是,尽管使用 Boost pool_alloc 之类的东西来管理元素本身的分配,std map 是否仍会使用少量堆内存作为某种形式的容器开销,而不是由 boost pool_alloc 管理?关于使用 std 映射本身,我正在考虑指向元素的指针?
c++ - 用于 C++ 的类talloc 池
是否有任何内存分配库可以提供类似talloc 的池并且专门设计用于与C++ 的功能一起使用?
尤其是:
我可以提前预测一个游泳池需要多大。我不会有意外溢出它的风险。
如果我在一个池中分配一个对象,我将不需要回收它的存储,直到整个池被释放。(所以对象可以简单地在池中按顺序分配,不会比插入填充来解释不同类型的对齐造成更多的浪费。)
我需要能够在单个池中分配各种大小和对齐的对象。
我需要将标准库容器的元素存储在池中。(在
std::vector
s 的特殊情况下,我会在构建时设置内部缓冲区的容量,然后我不会尝试进一步增长向量。)
我不想做的是:
- 重新发明析构函数。
- 重新发明例外。
- 重新发明标准库容器。
- 使用
void *
.
java - Java - 本机/非本机例程的自定义分配器接口
我正在尝试创建一个接口来分配和取消分配数据并提供这种类型的内存池。我决定制作一个 Allocator 接口,并在其中使用各种分配类型的内存分配方法(例如 java new 或 FFTW 本机绑定)
这是界面:
}
还有两个实现接口的类示例:
}
和
}
我试图在我的 DynamicMemoryPool 中使用这些: public class DynamicMemoryPool {
}
所以我的问题是在尝试创建 DynamicMemoryPool 的实例并声明分配器的类型时。例如:
上面的行给了我一个 JavaAllocator 错误,它需要分配器。任何关于如何让这种结构工作的想法都会很棒。这是我在进行初始测试时编写的一些先前代码的重新编码,其中我基本上拼出了大约 8 种不同类型的不同 BlockingQueue。现在我想要 8 个不同类型的 DynamicMemoryPools。谢谢你的帮助。
编辑:我似乎已经解决了这个问题:
DynamicMemoryPool<T> memoryPool = (DynamicMemoryPool<T>) new DynamicMemoryPool<double[][]>(200, false, new JavaAllocator(), size);
不幸的是,这迫使我添加 @SuppressWarnings("unchecked")
c - 使用 C 编程语言的不透明指针与 id 数字的优缺点是什么?
我目前使用不透明指针作为我的标准封装技术,但是查看 OpenGL API 让我认为使用 id 编号可能是更好的选择。我想从经验丰富的 C 程序员那里得到一些建议(我只积极使用该语言大约 2 年)。
以下是我想要确认或纠正的最初想法。
身份证号码的可能优点:
如果使用 id 编号,则在实现中使用对象/内存池相当简单
id 号不必映射到系统内存(在 GL 情况下可以参考图形内存)
身份证号码的可能缺点:
- 使实现稍微复杂一些
考虑到使用共享库的情况,还有一个类似的问题: 我应该为我的不透明对象使用整数 ID 还是指针? 我的问题不是关于共享库,而是关于从用户代码中隐藏实现细节的一般情况。
我想您可以 typedef 一个 MyObjectHandle 以使库能够在 id 号和不透明指针之间切换。
问题是: 使用 C 编程语言的不透明指针与 id 数字的优缺点是什么?
algorithm - 用于自动分配的编译时内存池算法
我在网上寻找任何内存池算法。但是,我找不到任何符合我要求的简单英语。
我基本上需要一个不需要很快的编译时算法,但是它应该尽可能高效,这意味着:尽可能小。
它还应该具有可变宽度和对齐支持。
运行时算法没什么大不了的,因为可以在任何地方找到实现。然而,另一个是不同的故事。
我想知道是否有人可以给我有关算法或某个起点的信息。
c# - 从预分配和池化所有内存的线路转换为基本类型(int、decimal、Datetime ...) - 如何绕过 System.String
我们有一个应用程序不断地从网络中读取大量数据。我们将 GC(甚至是 gen0 收集的累积效应。我们使用 ETW 收集来支持我们的发现)确定为最大的瓶颈,因此我们尝试执行内存池以避免任何收集启动。
我们可以预先分配巨大的字节数组以连续从网络读取而无需分配,我们可以对 char 数组执行相同的操作(以避免在使用 Encoding 类转换期间分配),但是似乎没有办法转换为基本类型(int , decimal ...) 无需重新发明轮子(意味着重新实现 BCL 在 TryParse 方法中所做的事情)或不创建垃圾(将 char[] 转换为要丢弃的字符串)。
所以这是我的问题:
- 是否可以以某种方式将 char 数组注入字符串,或者强制字符串从可重用的内存池中分配内存?我正在研究字符串的反射内部,这似乎是一项不可能完成的任务,但我欢迎任何建议
或者
- 是否可以利用一些标准转换函数从 char[] (或其他文本,但不是 System.String 形式)转换为基本类型?再次 - 我正在研究 System.Number 的反射代码 - 看起来卧底函数需要 char *,因此可以通过反射调用它们;然而,日期时间转换仍然使用字符串。
欢迎任何建议。
c++ - 具有可变大小页面的缓冲池。当传入页面大于要驱逐的页面时,需要一种高性能的方式来合并页面
在数据库缓冲池(内存池)的实现中,我有一个由内存中的页面组成的缓冲区。
这些页面有不同的大小(都是 512kb 的整数倍)。
假设我的驱逐策略是 LRU(最近最少使用),但我试图驱逐的页面的大小小于我需要替换的大小,如果我也想遵循 LRU,我应该驱逐尽可能多的 LRU 页面以适应我的新页面。
假设我需要n
驱逐最近使用的页面。然而,这些页面在缓冲/内存池中不一定是连续的。
我想到的一个简单方法是合并这些n
页面,这意味着我需要适当地重新排序缓冲池。
最简单的方法是复制整个缓冲区并覆盖永久缓冲区并适当地更新数据类型。然而,这假设我们有足够的 RAM 来为这个操作复制整个缓冲区。有没有一种聪明的方法,我不必复制整个缓冲区?
谢谢
c++ - 基于文件的内存池 - 可能吗?
每当使用 new / malloc 时,操作系统都会创建一个新的(或重用)堆内存段,与页面大小对齐并将其返回给调用进程。所有这些分配将构成进程的虚拟内存。在 32 位计算中,任何进程最多只能扩展到 4 GB。堆分配越高,进程内存的增加率越高。尽管有很多可用的内存管理/内存池,但所有这些实用程序最终都会再次创建一个堆并有效地重用它。
另一方面,mmap(内存映射)提供了将文件可视化为内存流的能力,并使程序能够直接在文件上使用指针操作。但在这里,mmap 实际上是在进程空间中分配地址范围。因此,如果我们 mmap 一个大小为 3GB 的 3GB 文件并获取进程的 pmap,您可以看到该进程消耗的总内存 >= 3GB。
我的问题是,是否可以有一个基于文件的内存池[就像映射文件一样],但是,它并不构成进程内存空间。我想象一下像内存数据库这样的东西,它由一个文件支持,读/写速度非常快,它支持指针操作[即获取指向记录的指针并存储任何东西,就像我们使用 new / malloc 一样],它可以在磁盘上增长,而无需触及进程虚拟 4GB 限制。
可能吗 ?如果是这样,我开始工作的一些指示是什么。我不是要求一个现成的解决方案/链接,而是从概念上理解它是如何实现的。
c - 如何在c中将malloc内存划分为块
如果我有 *p=malloc(1000),我想将内存 p 分成 200 和 300 的块,并获取块的地址并使用它。有什么简单的方法可以做到这一点吗?
c++ - 提高字符串的分配性能
我将 Java GC 测试程序移植到 C++(见下面的代码)和 Python。Java 和 Python 的性能比 C++ 好得多,我认为这是由于new
每次都必须执行所有调用来创建字符串。我试过使用 Boost fast_pool_allocator
,但实际上性能从 700ms 恶化到 1200ms。我使用分配器是错误的,还是我应该做的其他事情?
编辑:用g++ -O3 -march=native --std=c++11 garbage.cpp -lboost_system
. g++ 是 4.8.1 版本,Python 的一次迭代大约需要 300 毫秒,Java 大约需要 50 毫秒。std::allocator
大约 700 毫秒,大约 1200 毫秒boost::fast_pool_allocator
。