大型操作时的C ++暂停/恢复系统

时间:2019-01-18 20:27:54

标签: c++ performance resume pause

我有一个C ++程序,该程序可以加载几百万行的文件并开始处理,同样的操作由php脚本完成,但是为了减少执行时间,我切换到了C ++。

在旧脚本中,我检查了“ pause”文件夹中是否有一个具有当前操作ID的文件,该文件为空。这只是检查是否请求暂停,然后在每5次迭代后检查脚本如果有这样的文件,如果有的话,它停留在一个空循环中,直到该文件被删除(又名履历表):

foreach($lines as $line)
    {
        $isFinished = $index >= $countData - 1;
        if($index % 5 == 0)
        {
            do
            {
                $isPaused = file_exists("/home/pauses/".$content->{'drop-id'});
            }while($isPaused);
        }
        // Starts processing the line here 
}

但是由于磁盘访问速度相对较慢,所以我不想采用相同的方法,因此我想到了一些模拟此命令的命令:

$ kill cpp_program // C++ program returns the last index checked e.g: 37710
$ ./main 37710
$ // cpp_program escapes the first 37709 lines and continues its job

您如何看待这种方法?这可行吗?它不费时吗?有没有更好的办法? 谢谢

编辑:一个澄清,因为这似乎有点模棱两可,该任务在后台运行,还有另一个应用程序启动了这个,我希望能够将管理应用程序的命令(通过Linux命令)发送到后台任务来暂停/继续。

1 个答案:

答案 0 :(得分:2)

在大多数操作系统上,要跳到文本文件的37710行,需要先读取所有37710行。

在大多数操作系统上,文本文件是二进制文件,具有换行符的约定。但是操作系统不会缓存换行符。

因此,要查找换行符,必须读取每个字节。

如果您的程序保存了已到达文件的字节偏移量,则它可能会搜索到该位置。

您可以在关闭程序时将程序的状态保存到某个配置文件中,并将其设置为在再次启动时默认恢复。这将需要捕获您用来关闭的信号,使您的主逻辑注意到信号标志已设置,然后干净地关闭。这是一个非常C风格的操作。


现在,使程序可远程控制的另一种传统方法是让程序在TCP端口(和/或stdin)上侦听并在那里接受命令行命令。

要这样做,您需要编写一个REPL组件,然后将其连接到任何输入和输出。

要么在处理文件之间以协程的方式进行REPL,要么生成单独的线程来进行REPL,并使它与处理线程异步通信。

但是,这可能超出您的能力范围。此步骤的每一步(编写一个REPL系统,使其不阻止主要工作,响应命令,然后将其附加到TCP端口)都需要您付出一些努力和学习。