我有大量的文件,每个文件将被解码,sorting/最小化,然后放入一个数据库。 每个操作都有自己的bash脚本。 这些文件被分类到每日文件中,这些文件在其连续的每月文件夹中。 问题是只有一个数据库和一个表(SQLite),因此数据库脚本只能在一个文件上运行,而解码和sorting可以同时在大约四个文件中完成。
对于要sorting的文件,必须经过解码过程,才能将文件放入数据库,必须进行解码和sorting。 这些脚本的运行时间是不一样的,我相信解码是禁食,然后来input然后来sorting。
每个bash脚本decode.sh
sort.sh
saveintodb.sh
循环遍历文件夹中的所有文件并执行其工作。
本来我想有一个masterscript执行decode.sh
– > sort.sh
– > saveintodb.sh
为每个文件夹(月)。
但是,由于预计需要几天,我想到了这样的事情:
1: decode.sh January 2: sort.sh January, decode.sh February 3: saveintodb.sh January sort.sh February decode.sh March 4: saveintodb.sh February sort.sh March decode.sh April
等到十二月。
但是,我不知道我是如何设置的,这是一个很好的方法。 我知道我可以在2:
运行脚本,但是我不太确定如何运行脚本3:2:时自动完成。
我也不确定这是否是最好的办法。 理想情况下,一直运行解码脚本,sorting脚本和saveintodb脚本。 也许甚至有几个解码和sorting脚本(不知道如果这会加快这个过程,我正在外面的HD悲伤)。
数据量: 1.3 TB
数据types:文本文件
背景:位置报告(纬度/经度,时间)
对不起,这个长文本,有什么build议吗?
在Linux上,使用crontab(5)安排各种shell脚本。 他们可以并行运行。
你也可以看看GNU平行 ,但我想你不需要它。
最后,shell脚本可以使用at或batch
来调度另一个脚本。 例如, decode.sh
可能可能以batch -f sort.sh
结尾,或者at -f sort.sh now + 10 minutes
你可能会使用一些更强大的脚本语言,例如Python,Guile,Perl,….
顺便说一下,一定要测试每个脚本的成功(甚至是其中的部分)。 使用记录器(1)发送日志消息(也许在每个步骤或命令持续半小时以上,在每个脚本的开始和结束之后)。 每天检查日志!
最后,我不明白为什么一次只能运行一个数据库脚本。 大多数真正的DBMS(PostGreSQL,MonGoDB,MariaDB等) – 但不是sqlite – 可以运行(或被配置为运行)同时访问同一数据库(或者当然不同的数据库)的数据库客户端。 阅读有关ACID属性的更多信息。
这样做在一些外部的USB硬盘是恕我直言,是一个错误,因为这样的硬件有限的可靠性(通常很慢)。 你应该考虑有一些服务器(也许一个好桌面可能有这样的角色)。 你可能需要一个UPS来避免电源故障。
如果这种复杂的处理和处理后的数据对您有一定的价值,您应该升级硬件(可能需要一台服务器,可能带有UPS和ECC RAM ,如果数据合适的话,还可以使用SSD )和软件(使用真正的DBMS ,关心失败)。 估算失败和/或数据丢失的成本(记住考虑你的时间)。 也许租用一些云计算或存储可能是有趣的(或者简单地说是一个带有备份的VPS托管的Linux系统,每个月你可以得到一个大约两十美元或者欧元的钱: kimsufi , ovh , rackspace , aws ,…)。 。
你可以有两个脚本,一个具有for循环,解码和排序,并创建一个文件作为另一个脚本的标志。 另一个脚本会在while循环中检查这些文件,并将它们放入数据库中。 脚本1
function decodeAndSort{ decode.sh $1 sort.sh $1 touch ./tmpDir/$1 } for month in months do decodeAndSort $month & # the ampersand is to run in the background done
脚本2
array=bla #with names of files while [[ $count -lt 12 ]] do if [[ -e ./tmpDir/${array[$count]} ]] #test file exists saveintodb.sh ${array[$count]} rm ./tmpDir/${array[$count]} # clear the flag (( count++ )) else sleep 1 # adjust this as necesary fi done
使用GNU并行它看起来像这样:
doit() { sem --id decode decode.sh $1 sem --id sort sort.sh $1 sem --id dbsave saveintodb.sh $1 } export -f doit parallel -j4 doit {} ::: Jan Feb Mar ...
这将确保您一次运行一个解码,排序和saveintodb。 如果你只想保护saveintodb:
doit() { decode.sh $1 sort.sh $1 sem --id dbsave saveintodb.sh $1 } export -f doit parallel -j4 doit {} ::: Jan Feb Mar ...
在这里,你将有4个解码/排序运行,但只有一个saveintodb。
sem
是GNU Parallel的一部分。
GNU并行是一个通用的并行程序,可以很容易地在同一台机器或多台你有ssh访问的机器上并行运行作业。 它通常可以代替一个for
循环。
如果你想在4个CPU上运行32个不同的作业,那么最简单的方法就是在每个CPU上运行8个作业:
当一个完成时,GNU并行会产生一个新的进程 – 保持CPU活动,从而节省时间:
安装
如果您的发行版没有打包GNU Parallel,则可以进行个人安装,而不需要root权限。 这可以在10秒内做到这一点:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
学到更多
查看更多示例: http : //www.gnu.org/software/parallel/man.html
观看介绍视频: https : //www.youtube.com/playlist? list = PL284C9FF2488BC6D1
浏览教程: http : //www.gnu.org/software/parallel/parallel_tutorial.html
注册邮件列表以获得支持: https : //lists.gnu.org/mailman/listinfo/parallel