【发布时间】:2013-11-19 09:21:41
【问题描述】:
我需要一个单一的写入器和多个读取器(最多 5 个)机制,写入器会推送大小几乎为 1 MB 的数据,并且每秒连续推送 15 个包,这将在 c++ 中编写。我正在尝试做的是一个线程继续写入数据,而 5 个读取器将同时根据数据的时间戳进行一些搜索操作。我必须将每个数据包保留 60 分钟,然后才能将它们从容器中取出。
由于数据可以像 15 MB * 60 秒 * 60 分钟 = 54000MB/h 一样增长,我需要将近 50 GB 的空间来保存数据并使操作对写入器和读取器都足够快。但问题是我们无法将这种大小的数据保存在缓存或 RAM 中,因此它必须位于 SSD 等硬盘驱动器中(HDD 对于这种操作来说太慢了)
到目前为止,我一直在想的是,将循环缓冲区(因为我可以计算最大大小)直接实现到 SSD 上,到目前为止我找不到合适的例子,我没有'不知道是否有可能,或者实现某种映射机制,即一个循环数组将在 RAM 中可用,它只保留数据的时间戳和内存的物理地址,以搜索可用的数据硬盘。所以我猜至少搜索操作会更快。
由于任何类型的锁、互斥锁或信号量都会减慢操作速度(尤其是写入至关重要,我们不能因为任何读取操作而丢失数据)我不想使用它们。我知道有一些共享锁可用,但我再次认为它们有一些缺点。有没有办法/想法来实现这种无锁、无等待和线程安全的系统?任何数据结构(容器)、模式、示例代码/项目或其他类型的建议都将受到高度赞赏,谢谢...
编辑:除了更大的 RAM 之外,还有其他想法吗?
【问题讨论】:
-
如果上限真的是 50gb,我很确定您可以轻松获得一台可以处理它的机器。 128gb 对于重型工作站来说是相当标准的。
-
如果您的内存有限,那么只需将最后几秒钟保留在 RAM 中,然后在使用 memory-mapped files 时将其他几秒钟刷新到磁盘。
-
@JoachimPileborg 在 RAM 中仅保留几秒钟没有任何帮助。因为阅读器线程可以请求任何时间范围内的数据,而不仅仅是最后一个。
标签: c++ multithreading thread-safety circular-buffer readerwriterlock