当前位置: 首页 > news >正文

亳州做网站哪家好新乡seo顾问

亳州做网站哪家好,新乡seo顾问,joomla功能型网站建设,佛山顺德专业做网站最近要批量解压归档文件和压缩包,所以就想能不能并行执行这些工作。因为tar自身不支持并行解压,但是像make却可以支持生成一些文件,所以我才有了这种想法。 方法有两种,第一种不用安装任何软件或工具,直接bash或其他 …

最近要批量解压归档文件和压缩包,所以就想能不能并行执行这些工作。因为tar自身不支持并行解压,但是像make却可以支持生成一些文件,所以我才有了这种想法。

方法有两种,第一种不用安装任何软件或工具,直接bash或其他 Shell 中就可以使用;第二种需要安装 GNU parallel 这个工具来进行。二者在使用上都很简单,但是后者更人性化(应该可以用这个词来形容)一些。最后还介绍了一种比较奇特的方法,是无意中看到的,虽然没啥用但是有点意思。

直接在命令最后使用&

这个方法需要在命令最后使用&,也就是将这个命令放入后台执行。如下是并行解压提取当前文件夹下所有的归档文件的方法:

for tarfile in *.tar; do tar xvf $tarfile &
done;

可以看到这个方法可以说是非常简单了,但是最大的问题就是它会给每个归档文件创建一个进程,并不会自动根据设备的线程数而创建合适数量的进程(tar由于需要大量 I/O,所以也无法维持高 CPU 使用率),如下:

请添加图片描述

如果是小数量的解压提取可能没什么问题,但是如果特别大数量的归档文件解压提取,那么可能会造成调度损耗过大。如果需要根据实际线程数量生成,那么就复杂多了。

使用GNU parallel

这个工具很好用,不光可以设置最大并行任务数量,还可以通过--bar选项显示当前总进度如何。使用方法如下(还是解压提取一堆归档文件):

parallel tar xvf ::: *.tar

这种方法但是像time,将需要并行化的命令放到parallel后面即可,而不同命令之间不同的地方(参数部分)使用:::标注出来。

而且相比上一种方法,默认情况下最多只会创建 CPU 的线程数的进程,而不是一次性全部生成。如下:

请添加图片描述

可以看到一开始只生成了线程数量的进程,也就是8个进程。如果想手动设定最大并行进程数量,那么使用-j 数量即可(make-j选项一样,有没有空格都行)。

管道传递参数

上面是直接可以获取参数的情况,并不存在不同程序之间通过管道(pipe)传递信息的情况。那么面对这种情况该怎么办呢?

使用{}在下一个程序的参数部分,作为即将传递的参数字符串的占位符,而且parallel也要使用在下一个程序前面。需要注意的是:传递的参数是分散开传递的。比如说一个多行字符串"1234\n1234\n1234"会被传递成三个单行字符串"1234","1234","1234"

假设一个文本文件中,每一行都是一个地址,我们想并行下载所有链接的文件,那么可以使用:

cat abc.txt | parallel wget {}

但是面对比如说使用grep批量查询abc.txt中含有abc的行有哪些,如果还使用上面这样的传递,由于是分散开传递的,那么这个单独的字符串会被当作文件名:

cat abc.txt | parallel grep abc {}

结果如下:

$ cat abc.txt | parallel grep abc {}
grep: bfjksa: No such file or directory
grep: afhjha,fsj: No such file or directory
grep: abcshjagf: No such file or directory
grep: a;hfahabc: No such file or directory
grep: ahsfhmabc: No such file or directory

在这种就不要使用并行化,因为读取硬盘上的文件实际上是串行的,对单个或多个文件使用并行读取或写入几乎不会有任何性能提升,有时甚至还会降低(跳来跳去比顺序读取当然慢了)。

比如说官方有个例子是查找当前目录下所有文件中含有某一字符串的行,这里我查找main这个字符串:

$ time find . -type f | parallel grep -H -n main {}
./mem_disk_speedtest_in_C/.git/config:10:[branch "main"]
...real    0m26.651s
user    0m3.351s
sys     0m1.030s

而不使用 GNU Parallel 的命令为(并不是直接删除parallel部分就行了,需要做出一些调整):

$ time grep -H -n main $(find . -type f)
./mem_disk_speedtest_in_C/.git/config:10:[branch "main"]
...real    0m22.247s
user    0m3.204s
sys     0m0.809s

可以看到慢了 18%。这是比较坏的情况,一般情况下,用不用 GNU Parallel 速度都没什么变化。

更多选项请见官方文档:GNU Parallel Tutorial

二者的速度区别

实际测试上,直接在命令最后使用&要比使用GNU parallel慢一些(应该就是因为调度损耗了一部份性能),如下:

方法运行时间(秒)
串行237.9
&152.1
GNU parallel121.3

但是由于这里使用的 CPU 缓存较少,所以解压速度也没有 8 倍的提升,但是提升一倍也是不错的了。

扩展

正如开头所说,make是可以并行生成一些文件,而且可以通过-j选项设置最大并行任务数量。我们也可以利用这点来解压提取文件,但这并不是一个正经的办法,仅限于开拓眼界,因为有点“脱裤子放屁”的感觉(因为生成Makefile中的target部分需要使用CMake或者Bash来自动生成),正经使用的时候还是不要使用这种方法。

这个方法是我在 Running commands in parallel with a limit of simultaneous number of commands - superuser 中看到的,进行了一些尝试,可以说除了奇特毫无优点(通用性比不过&,易用性比不过 GNU Parallel),所以不推荐使用。

参考资料

Parallelize a Bash FOR Loop - Unix StackExchange

Can I use pipe output as a shell script argument? - superuser stackexchange

http://www.mmbaike.com/news/64524.html

相关文章:

  • 电子商务公司是诈骗吗武安百度seo
  • 视频下载网站软件做副屏seo整站优化外包公司
  • 建设一个广告联盟的网站深圳营销型网站
  • scrm和crm如何配合东莞网站建设优化诊断
  • html5网站动效怎么做百度平台推广联系方式
  • 哈尔滨工程建设信息网站百度快照推广是什么意思
  • 网站建站是 什么seo流量
  • 微网站制作电话福州百度快速优化
  • 营销网站的建设与管理包括哪些事项seo教程网站优化推广排名
  • 网站开发常用工具新闻20字摘抄大全
  • 产品质量推广营销语seo个人博客
  • 网站怎么做图片动态图片不显示不出来的私人浏览器
  • 怎么免费做网站视频教学著名的网络营销案例
  • wordpress 添加过滤器网站seo优化检测
  • html是建网站导航栏怎么做怎么查看域名是一级还是二级域名
  • 直播小程序源码福建seo优化
  • 百度手机网站优化百度精准营销获客平台
  • 网站开发h5页面福州seo网站管理
  • 给赌博人做网站seo是免费的吗
  • 做jsp网站的步骤网络营销主要做些什么
  • 西安蓝海网站建设西安seo优化排名
  • 拿品牌做网站算侵权吗微信小程序开发费用一览表
  • 做企业网站的要点seo外链优化策略
  • 做信息发布类网站用什么语言免费b站在线观看人数在哪儿
  • 正品查询网站怎么做seo排名分析
  • 对政府网站建设的整改报告搜狗站长工具综合查询
  • vs和sql怎么做网站百度app安装下载
  • 政府单位有必要网站建设吗精准大数据获客系统
  • 用dw做旅游的网站的设计域名收录批量查询
  • 8有免费建网站网络营销电子版教材