我需要在客户端服务器应用程序中使用日志记录和过滤机制。其中客户端可以根据某个参数请求日志数据。
日志将MACID,日期和时间,命令类型和方向作为字段。
服务器也可以根据这些参数过滤日志数据。 日志的大小为10 MB,之后日志将从开头覆盖消息。
我的方法是将数据作为“在内存中”在STL容器中记录到文件中,以便当客户端请求数据服务器根据任何条件过滤日志数据时
因此,服务器将首先对vector<>上的特定条件进行排序。然后使用二进制搜索过滤它。
我打算在内存记录数据中使用vector作为STL容器。
我对于矢量是否适合这种情况感到有点困惑。
因为向量中数据的大小最大可达10 mb。 我的问题是,矢量对于这种情况是否足够了?
答案 0 :(得分:1)
我会选择一个双端队列。它就像一个向量,但你可以从两端添加/删除元素。
答案 1 :(得分:1)
我首先声明我会使用一个日志库,因为有很多,我向你保证他们会做得更好(log4cxx为ex)。如果你坚持这样做你自己一个向量是一个合适的机制,但你必须手动排序根据用户请求偏向的数据。另一个想法是使用sqllite并让它管理存储排序和过滤数据。
答案 2 :(得分:0)
实际响应将在很大程度上取决于使用模式和界面。如果您使用的是图形用户界面,那么很可能已经有一个小部件在某种程度上实现了该功能(能够按不同的列排序,甚至过滤)。如果你真的想在UI之外实现这个,那么它将取决于使用模式,用户是否希望特定视图比其他人更多?她只需要过滤,还是排序?
如果在大多数情况下会有一个数据视图,并且您只需要显示不同的订单几次,我会保留std::vector
或std::deque
个元素,并在需要时使用remove_copy_if
过滤掉。如果需要不同的排序,我将复制并对副本进行排序,以避免必须重新排序,以便继续向日志添加元素。请注意,如果应用程序不断推送您需要使用新元素更新副本所需的数据(或提供固定视图并定期重新运行操作)。
如果没有特定视图比其他视图更频繁发生,如果您不想经历上述实现的痛苦,请查看一个boost多索引容器。它们使用不同的标准保持相同数据的同步视图。在最后一种情况下,这可能是效率最高的,即使在一般主导视图的情况下效率可能较低,也可能使事情变得更简单,因此它仍然值得。