C++ 是否有一个快速内存队列,我可以使用它交换项目,因为它达到了一定的大小?

C++ 是否有一个快速内存队列,我可以使用它交换项目,因为它达到了一定的大小?,c++,c,io,cuda,message-queue,C++,C,Io,Cuda,Message Queue,我已经使用c/c++/cuda不到一周了,对库的所有可用选项都不熟悉(如果我的问题太古怪或不可能,请原谅)。这是我的问题,我有一个处理过程,它获取数据并分析数据,然后做三件事中的一件,(1)保存结果,(2)丢弃结果或(3)分解数据并将其发送回处理 通常情况下,选项(3)会创建大量数据,并且我很快就超过了可用内存(我的服务器是16 Gig),因此我的解决方法是设置一个队列服务器(rabbitmq),我可以从中发送和接收工作(一旦队列达到某个内存大小,它就会交换队列)。当我使用具有更快NIC的小型服

我已经使用c/c++/cuda不到一周了,对库的所有可用选项都不熟悉(如果我的问题太古怪或不可能,请原谅)。这是我的问题,我有一个处理过程,它获取数据并分析数据,然后做三件事中的一件,(1)保存结果,(2)丢弃结果或(3)分解数据并将其发送回处理

通常情况下,选项(3)会创建大量数据,并且我很快就超过了可用内存(我的服务器是16 Gig),因此我的解决方法是设置一个队列服务器(rabbitmq),我可以从中发送和接收工作(一旦队列达到某个内存大小,它就会交换队列)。当我使用具有更快NIC的小型服务器传输数据时,这种方法非常有效,但最近我一直在学习并将代码从Java转换为c/c++并在GPU上运行,这使得队列成为一个巨大的瓶颈。瓶颈显然是网络io(在廉价系统上的评测显示cpu使用率很高,在旧的gpu上类似,但新的更快的cpu/gpu没有得到太多的利用,网络io稳定在300-400/mbs)。因此,我决定尝试完全消除网络,并在服务器上本地运行队列服务器,这使其速度更快,但我怀疑如果使用不依赖外部网络服务的解决方案(即使我在本地运行它们),可能会更快。它可能不起作用,但我想尝试一下

所以我的问题是,有没有什么可以像队列一样使用的东西,我可以在读取条目时删除它们,但当队列达到一定大小时,也可以将其交换到磁盘(但保持内存队列始终处于满状态,这样我就不必等待从磁盘读取)?在了解Cuda时,有许多研究人员对巨大的数据集进行分析的例子,他们如何保持数据以最快的速度进入系统进行处理(我想他们不受磁盘/网络的限制,否则更快的gpu不会真正提高性能)

有这样的事吗


p、 如果有帮助的话,到目前为止,我已经试验过rabbitmq(对我来说太慢了)、apollo mq(很好,但仍然基于网络)、reddis(非常喜欢它,但不能超过物理内存)、玩mmap(),并且我还压缩了数据以获得更好的吞吐量。我知道一般的解决方案,但我想知道是否有c/c++、cuda或库我可以使用(理想情况下,我会在cuda全局内存中有一个队列,交换到主机内存,交换到磁盘,这样GPU的将始终全速运行,但这可能是一厢情愿的想法)。如果您还有其他想法,请告诉我,我很乐意尝试(如果有帮助,我会在Mac上开发并在linux上运行)。

让我提出一些完全不同的建议

对于一个有经验的程序员来说,构建一个定制的解决方案不会太难,但是对于一个没有经验的程序员,甚至是中级程序员来说,生成一个健壮可靠的解决方案可能是不可能的

你考虑过数据库管理系统吗

对于小数据集,它将全部缓存在内存中。随着DBMS的发展,它将拥有一些非常复杂的缓存/分页技术。你可以免费获得排序/优先级排序、同步/共享等好处

一个写得非常好的定制解决方案将比DBMS快得多,但在开发和维护定制解决方案方面会有巨大的成本。花一点时间优化和调优DBMS,它开始看起来非常快,而且非常健壮


它可能不适合您的需要,但我建议您在拒绝使用DBMS之前仔细研究一下它。

标准模板库容器的开源实现就是为了解决这个问题而创建的

几乎透明地将任何标准STL容器的数据交换到磁盘。它编写得很好,维护得很好,并且非常容易根据与STL的相似性调整/迁移代码

另一种选择是使用现有的STL容器,但指定一个磁盘支持的分配器。所有STL容器都有一个STL分配器的模板参数,该参数指定如何存储条目的内存。有一个很好的磁盘支持的STL分配器就在我嘴边,但我似乎无法通过谷歌找到(如果/当我找到时,我会更新这个)


编辑:我知道罗杰实际上已经提到了这一点。

?也许是STXXL?谢谢伊尔贾恩和罗杰,我将两者都尝试一下@andrewcooke我认为它最终需要交换到磁盘b/c队列的大小超过了物理内存,但如果有其他更快的方法,我会尝试一下。你应该能够做得比分页更好-智能解决方案将能够在需要数据之前读取磁盘;当您开始从调出的页面读取时,分页将暂停。@andrewcooke这正是我想要的。队列服务器似乎能够保持内存队列不变,并向磁盘添加额外页面(但当内存队列变空时,也会补充内存队列)。我不知道如何在不通过网络的情况下做到这一点。我下意识的反应是“eew no!”,然后我就让它沉入其中,变成了“你知道吗?这是一个很好的黑客攻击,对于经验不足的开发人员来说是一个非常好的主意。”我有一个+1。我在一个项目中使用STXXL,对此非常满意。感谢作者们出色的工作。不过,我没有将其作为答案添加的原因是,我认为它只使用了磁盘,几乎没有使用任何内存。也就是说,问题在于只有当内存耗尽时,队列才会无缝扩展到磁盘存储。STXXL能做到吗?嘿,你终于记得你提到的磁盘备份STL分配器的名字了吗?