【问题标题】:Delaying file data for several minutes延迟文件数据几分钟
【发布时间】:2012-06-14 17:50:04
【问题描述】:

在我的机器上,我有一个应用程序每秒重新生成的文件 - 它每次都包含不同的数据,因为它基于一些实时数据。

我想要一份此文件的副本,其中包含原始文件 5 分钟前包含的内容。这在某种程度上很容易实现吗?我很乐意使用一些 BASH 脚本魔法来做到这一点,但是向原始应用程序(用 c++ 编写)添加一些明智的、内存效率高的代码也会让我满意 :)

【问题讨论】:

  • 你能简单地将数据存储在一个变量中吗?或者可能是一个临时文件?
  • while true; do cp file 5ago-file; sleep 300; done 你在找什么?
  • Dave:如果他需要始终能够看到文件 5 分钟前的样子,他需要每秒复制文件并保留过去的 5分钟的副本(即 300 个文件副本)。
  • @Dave:不完全是,我需要每秒更新该副本文件,但数据已过时。
  • 滞后文件并非不可能,但有一些技巧可能会简单得多。如果您只是将数据附加到末尾,为什么不只使用一个文件,为所有条目添加时间戳,并在 5 分钟前读取条目?或者,如果它不是按顺序附加的,则保留一个从记录到时间戳的映射(用 C++ 术语)。这样的事情听起来合理吗?

标签: c++ linux bash unix


【解决方案1】:

您使用 标记了您的问题。此答案仅适用于 Linux。

您可以使用inotify-tools (inotifywait man page) 或incron (incrontab(5) man page) 来查看目录并在文件关闭时复制文件。

【讨论】:

    【解决方案2】:

    如果磁盘空间不是问题,您可以让程序每秒创建一个新文件,而不是写入同一个文件。您总共需要 300 个文件 (5 min * 60 sec/min)。要写入的文件名为 $somename + timestamp() % 300。这样,要在 5 分钟前获取文件,您只需访问文件 $somename + (timestamp()+1) % 300

    【讨论】:

    • 注意:% 表示“模数”。替换为 bash 中提供的任何函数。 (我主要是 PHP 程序员)
    • 您可以在 bash 的 $(()) 算术块中使用 % 运算符。完整的等效表达式(假设您有一个“timestamp”函数)将是“$somename$(($(timestamp)%300)),第二个表达式是“$somename$((($(timestamp)+1) %300))。
    【解决方案3】:

    为了实现这一点,您需要空间来容纳 300 (5*60) 个文件中的每一个。由于您指出这些文件的大小只有 50K 左右,因此这在 15MB 内存中是可行的(如果您不想弄乱文件系统)

    它应该很简单:(类似)

    struct {char* buf; size_t size} hist[300]; //initalize to all nulls.
    int n = 0;
    struct stat st;
    for(;;sleep(1)){
        int ifd  = open("file", O_READ);
        int ofd = open("file-lag", O_WRITE);
        stat(ifd, &st);
        hist[n].size = st.st_size;
        if(hist[n].buf)
           free(hist[n].buf);
        buffer[n] = malloc(hist[n].size);
        read(ifd, hist.buf[n], hist[n].size);
        n = (n+1)%300;
        if(hist[n].buf)
            write(ofd, hist.buf[n], hist[n].size)
        close(ofd);
        close(ifd);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多