Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python2.x中每隔一段时间编写新文件_Python_List_Python 2.7_Rsync - Fatal编程技术网

在Python2.x中每隔一段时间编写新文件

在Python2.x中每隔一段时间编写新文件,python,list,python-2.7,rsync,Python,List,Python 2.7,Rsync,我目前有一个用Python 2.7编写的脚本,它整理了一系列变量。此脚本在Linux操作系统上每天24小时在机器上运行 我要做的是将这些列表中的数据移动到远程服务器。此数据传输将通过3G互联网连接进行,因此,我非常希望在本地写入数据,然后在连接可用时传输数据(由于覆盖率低等原因) 我的意图是,在代码运行开始时,捕获POSIX中的实际时间并创建一个新的.txt文件。然后,我将计算开始时间后的30分钟,并将此值添加到变量中。我打算让我的脚本签入它的连续循环来检查时间。如果它与30分钟POSIX值匹配

我目前有一个用Python 2.7编写的脚本,它整理了一系列变量。此脚本在Linux操作系统上每天24小时在机器上运行

我要做的是将这些列表中的数据移动到远程服务器。此数据传输将通过3G互联网连接进行,因此,我非常希望在本地写入数据,然后在连接可用时传输数据(由于覆盖率低等原因)

我的意图是,在代码运行开始时,捕获POSIX中的实际时间并创建一个新的.txt文件。然后,我将计算开始时间后的30分钟,并将此值添加到变量中。我打算让我的脚本签入它的连续循环来检查时间。如果它与30分钟POSIX值匹配,我将把列表中的所有信息写入.txt文件,然后创建一个全新的文本文件,并反复重复这个过程。然后我将使用RSync将.txt文件同步到中央服务器

这是完成这一过程的有效方法吗?如前所述,我将通过移动互联网(3G)将数据同步到远程服务器,因此可能会出现覆盖率较低的区域。因此,我发现在同步文件之前在本地写入数据更简单

我决定每30分钟创建一次文件,这样,如果脚本失败或断电,最多只会丢失30分钟的数据,而不是几个小时的数据

我想要任何关于我思考过程的反馈


谢谢

您的设计确实没有效率问题

你有一个连续的循环,大概在做一些重要的工作。与您正在做的任何事情相比,添加获取当前时间和每次通过循环进行一次浮点比较的成本将是非常便宜的,因此没有任何区别

如果您在循环中的大部分时间都没有做任何重要的工作,那么循环本身可能是您的主要性能成本,您最好少运行它

然而,打开文件,让它空置30分钟,然后一次写入/关闭/上传,这是非常奇怪的。更好的解决方案是在编写之前创建它。或者,更好的办法是,边写边写(而不是维护列表),可能每几秒钟刷新一次,然后每30分钟关闭/上传/替换一次

同时,如果Python代码试图每30分钟做一件事,你的cron工作也是如此,那么它们显然是不同步的。由于3G问题,您预计它可能会失去同步数小时,所以这可能不是问题


最后,您所做的与syslog样式的日志记录和日志旋转非常接近。即使它在技术上不是通常意义上的日志文件,也可能值得一看linux和/或Python(特别是类似于或其他处理程序)能为您做些什么。

这就是我要尝试做的

我会不断地将数据写入输出文件,每N条记录刷新一次。如果只损失1秒的数据,为什么要在崩溃中损失30分钟的数据

一旦文件达到一定大小,或者超过30分钟,我就会关闭文件并将其移动到
出站/
目录。然后我将创建一个新文件作为输出文件

一个单独的脚本将控制上传。一个粗略的例子:

inotifywait -q -m -e create /path/to/outbound | while read fpath cmd fname; do 
  fullpath=$f{fpath}/${fname}
  rsync $f{fullpath} remotehost && rm ${fullpath}
done

这将侦听出站目录中的创建事件,因此一旦您的scrip将文件移动到那里,
rsync
将启动。你也可以考虑<代码> rSyc——从Con中连续运行源文件。< /P>你所说的“高效”是什么意思?如果你已经有了一个循环,那么检查循环中的时间可能对你的CPU使用率/性能/内存/任何东西都没有明显的影响;为什么你会期望它呢?顺便说一下,你几乎肯定不想检查它是否与时间匹配,而是检查它是否匹配或超过时间。对不起@abarnert-是的,我的意思是匹配或大于。通过“高效”,我想知道除了我建议的方式之外,是否还有更好的方式来执行定期写入新文件的功能?从您的描述中,听起来好像您正在创建文件,将其保留为空,然后向其写入整个列表,关闭它,并在30分钟后一次性上载。如果这是真的,那么最好在编写文件之前创建它。或者,不维护列表;只需在执行过程中直接写入文件(可能每隔几秒钟调用
flush
)。这两种方法都可能更好,但从通常意义上讲,这两种方法都不更有效。同时,您首先需要该文件的原因是什么?为什么需要使用
rsync
?rsync的主要优点是它可以处理三角洲;对于发送全新的文件,FTP、HTTP PUT、scp等都一样好,它们都有很好的Python包装器,因此您可以直接发送给它们,而不需要真正的文件。