需要基于磁盘的优先级队列库,最好用于 C

Posted

技术标签:

【中文标题】需要基于磁盘的优先级队列库,最好用于 C【英文标题】:Need disk based priority queue library, preferably for C 【发布时间】:2009-02-09 06:20:02 【问题描述】:

我在 Unix 上的 C 语言中有一个排队机制。它接受 XML 事务。一些事务包含要存储的记录。其他事务请求这些事务。事务存储在一个文件中,该文件是一个本地队列。先进先出,非常简单。文件开头的标题区域,跟踪要读取的下一个位置和要写入的下一个位置。我们使用文件锁定,但不使用信号量,因为检索是从远程系统轮询的。并且只有一个程序可以访问队列。它在 C 中。多年来一直运行良好。

现在我们必须扩展系统。交易将包含一个额外的 XML 标记。我们必须根据该标签的值有选择地检索。我们将从一个简单的队列变成一个优先级队列。标签中可以有许多不同的值。说 AX、BX、CX、FL 和 TS。事务按接收顺序添加到队列中。我们需要能够按接收顺序检索它们,或者检索标签为 FL 的下一个事务。或 TS。或(CS 或 FL)。或者不是 AX。

如何最好地做到这一点?

简单快速是我们所需要的。我想到了几个选项:

    使用 Berkely DB 之类的工具将队列转换为各种数据库。 进入 PostgreSQL 数据库,创建可用作优先级队列的表。 找到一个可以满足我们需求的 C 库。 编写我们自己的基于磁盘的优先级队列。

我们有一些限制。时间在流逝,这需要在几周内完成。 C 用于快速插入系统。如果我们能够以足够快的速度来转换访问队列的程序中的所有其他业务逻辑,那么可能是 Python。最好不要使用 PostgreSQL,因为我们无法控制数据库系统,并且 DBA 对他认为是“他的”的东西有不良习惯,即使这是一个关键系统,我们也没有正常运行时间的可靠性。政治啊!! DBA 还表示,使用 PostgreSQL 表并不是一种有效的方法。我们更喜欢本地化的东西,以便我们可以控制它。必须以闪电般的速度每分钟处理大量事务。

我愿意接受任何建议,即使是很远的建议。建议越多越好。

【问题讨论】:

【参考方案1】:

听起来你真正需要的是;

    一种在检查标签时迭代记录的方法。 一种将记录标记为 NULL 的方法,以便通过常规处理跳过乱序选择的记录。

我建议最快的更改是让每条记录在包含此信息的文件中包含一个小标题(记录长度、isValid、标签信息等)。然后,您照常从第一条记录开始并遍历所有记录,直到遇到带有标签的记录,然后将此记录标记为无效,因此常规处理将忽略它。

从长远来看,您可能需要考虑 sqllite 之类的东西,它是免费提供的,适用于常规文件,并且可以编译到您的可执行文件中。对于大多数类型的记录搜索,它可能比你自己快速滚动的东西要快,而且更灵活:)

所以我现在会进行快速更改,并考虑在不久的将来重新设计您的数据格式,无论是使用 sqllite 还是其他方式。听起来您对队列的要求变得越来越复杂,所以现在是时候考虑一​​些可以在未来进一步扩展的东西了。

【讨论】:

我将编辑问题以更好地解释标签。说实话,我们确实使用文件锁定以防万一。 sqllite,是的,好主意。肯定比我们自己滚动要快。 将记录标记为空,是的。这实际上可能是最快的方法,最小的代码更改。不错。 我同意它应该是一个 WTF,但我不得不改变它。我一直在想,我相信我会接受你的建议。谢谢。从长远来看,我们会做一些明智的事情(当然,我们会有时间),但这会让我现在就开始。【参考方案2】:

我想到的第一件事是采用一些基于内存的优先级队列实现(应该很多),并将其置于您自己的内存分配例程之上,这些例程使用 mmap 文件作为其内存池。

【讨论】:

以上是关于需要基于磁盘的优先级队列库,最好用于 C的主要内容,如果未能解决你的问题,请参考以下文章

[C/C++标准库]_[0基础]_[优先队列priority_queue的使用]

C++ 标准模板库优先级队列抛出异常并显示消息“无效堆”

为啥在c++中实现基于类的优先级队列时需要重载operator<?

堆排序(Heapsort),优先队列可以用于O(N log N)

C++stack&queue(栈队列优先级队列)

C++stack&queue(栈队列优先级队列)