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

时间:2009-02-09 06:20:02

标签: data-structures priority-queue

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

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

如何做到最好?

简单快捷是我们所需要的。我想到了几种选择:

  1. 使用类似Berkely DB之类的东西将队列变成各种各样的数据库。
  2. 点击PostgreSQL数据库,创建一个可用作优先级队列的表。
  3. 找一个可以做我们想要的C库。
  4. 编写我们自己的基于磁盘的优先级队列。
  5. 我们有一些限制。时间在流逝,需要在几周内完成。 C用于快速插入系统。如果我们能够足够快地转换以转换访问队列的程序中的所有其他业务逻辑,那么可能是Python。不喜欢使用PostgreSQL,因为我们无法控制数据库系统,而且DBA对他认为“他的”具有令人讨厌的习惯,即使这是一个关键系统,我们也没有正常运行时间的可靠性。政治,呵呵! DBA还表示使用PostgreSQL表并不是一种有效的方法。我们更喜欢本地化的东西,所以我们可以控制它。必须快速闪电才能每分钟处理大量交易。

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

2 个答案:

答案 0 :(得分:0)

听起来你真正需要的只是;

  1. 在检查标记时迭代记录的方法。
  2. 将记录标记为NULL的方法,因此通过常规处理跳过无序选择的记录。
  3. 我建议最快的变化是让每个记录在文件中包含一个包含此信息的小标题(记录长度,isValid,tag-info等)。然后你正常地从第一个记录开始并迭代所有记录,直到你遇到一个带有标记的记录,当你这样做时,你将这个记录标记为无效,所以常规处理将忽略它。

    长期来看,您可能需要考虑像sqllite这样的免费提供的东西,可以使用常规文件,并且可以编译成可执行文件。对于大多数类型的记录搜索,它可能比你可以快速推出自己的东西更快,而且更灵活:)

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

答案 1 :(得分:-1)

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