0

我的程序中有一些动态队列,可以在处理过程中在后面或中间添加元素/从前面删除元素,一旦处理完成就永远不会将元素存储在内存中。但是我想记录/序列化序列的动态状态,包括出于自省目的而删除的所有元素。

例如

    struct element1{};
    struct element2{};
    std::deque<element1> v1;
    std::deque<element2> v2;

    if(some_cond1)
    {
       v1.push_back(element1{});
       //log v1.back()
       v1.push_back(element1{});
       //log v1.back()
    }
    if(some_cond2)
    {
       v2.push_back(element2{});
       //log v2.back()
       v2.push_back(element2{});
       //log v2.back()
    }
    if(another_cond)
    {
       v1.pop_front();//presently I am not logging removal of elements
       v2.pop_front();
    }
    if(a_third_cond)
    {
       v1.insert(some_pos,element1{});
       //log v1,some_pos
    }

我正在寻找两种替代解决方案。

  • 是否有一些数据格式(比如 JSON)允许数组/对象分布在不同的位置并通过一些唯一的名称/ID 引用,因为我没有保留内存中准备好的所有元素以写入文件并仅记录部分我去的顺序?

例如

   { 
     "v1" : [],
     "v2" : [],
     append("v1"):
     [
        "elem1_v1", "elem2_v1"
     ],
     append("v2"):
     [
        "elem1_v2", "elem2_v2"
     ],
     insert("v1",1):
     [
        "elem3_v1"
     ]
   }
  • 是否可以将多个不同的位置写入单个文件,以便每个序列跟踪自己的位置并写入该位置,以便最终结果是简单的连续序列描述?(我能想到的只是文件支持的 SGI 绳索实现)

在这种情况下,最终结果可能如下所示,

   { 
     "v1" : ["elem1_v1","elem3_v1","elem2_v1"],
     "v2" : ["elem1_v2","elem2_v2"]
   }

当然,以一种粗略的方式,我可以将所有元素记录在一个平面文件中,并以一些信息为前缀,例如哪个序列和位置,然后在整个文件中搜索它们以重建它们。但是,如果可以处理此类问题,我正在寻找一种更强大、更结构化的替代方案。

4

1 回答 1

2

您最好的选择是顺序记录(带有标识符)加上以后的重建。

随机访问日志的问题有两个:

  • 在大多数磁盘上,随机写入比顺序写入慢得多
  • 你应该预留多少空间?当它精疲力竭时你会做什么?

大多数时候,日志记录不是应用程序的主要目标。它是出于调查目的而添加的。因为它不是必需的,所以它应该是平淡无奇的:

  • 不工作?好吧,应用程序没有理由崩溃
  • 慢得要命?好吧,没有理由减慢应用程序的速度
  • ...

让离线流程完成繁重的工作并协调数据。

于 2013-01-16T07:56:17.157 回答