0

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

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

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

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

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

我想对我的思考过程有任何反馈。

谢谢

4

2 回答 2

1

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

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

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

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

同时,如果 Python 代码每 30 分钟尝试执行一次操作,而您的 cron 工作也是如此,那么它们显然会不同步。由于您预计由于 3G 问题,它可能会出现数小时不同步,因此这可能不是问题。

最后,您所做的非常接近 syslog 样式的日志记录和日志轮换。即使它在技术上不是通常意义上的日志文件,仍然值得看看 linuxsysloglogrotate/或 Python logging(特别是类似TimedRotatingFileHandler或其他处理程序之一)可以为您做什么。

于 2013-04-04T19:02:21.580 回答
0

这就是我会尝试做的。

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

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

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

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

这将侦听出站目录中的创建事件,因此一旦您的脚本将文件移到那里,rsync就会启动。您也可以考虑rsync --remove-source-files从 cron 连续运行。

于 2013-04-04T19:11:51.613 回答