2

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

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

如何最好地做到这一点?

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

  1. 使用 Berkely DB 之类的东西将队列变成各种数据库。
  2. 进入 PostgreSQL 数据库,创建一个可用作优先级队列的表。
  3. 找到一个可以满足我们需求的 C 库。
  4. 编写我们自己的基于磁盘的优先级队列。

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

我对任何建议持开放态度,即使是遥远的建议。建议越多越好。

4

2 回答 2

0

听起来您真正需要的是;

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

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

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

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

于 2009-02-09T06:29:55.723 回答
-1

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

于 2009-02-09T06:42:27.720 回答