中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux下怎么安裝和使用Parallel

發布時間:2022-02-11 09:59:49 來源:億速云 閱讀:778 作者:iii 欄目:開發技術

這篇文章主要介紹“Linux下怎么安裝和使用Parallel”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Linux下怎么安裝和使用Parallel”文章能幫助大家解決問題。

Parallel Python是Python進行分布式計算的開源模塊,能夠將計算壓力分布到多核CPU或集群的多臺計算機上,能夠非常方便的在內網中搭建一個自組織的分布式計算平臺。

Linux下怎么安裝和使用Parallel

安裝 GNU Parallel

GNU Parallel 很可能沒有預裝在你的 Linux 或 BSD 主機上,你可以從軟件源中安裝。以 Fedora 為例:

$ sudo dnf install parallel

對于 NetBSD:

# pkg_add parallel

如果各種方式都不成功,請參考項目主頁[1]。

從串行到并行

正如其名稱所示,Parallel 的強大之處是以并行方式執行任務;而我們中不少人平時仍然以串行方式運行任務。

當你對多個對象執行某個命令時,你實際上創建了一個任務隊列。一部分對象可以被命令處理,剩余的對象需要等待,直到命令處理它們。這種方式是低效的。只要數據夠多,總會形成任務隊列;但與其只使用一個任務隊列,為何不使用多個更小規模的任務隊列呢?

假設你有一個圖片目錄,你希望將目錄中的圖片從 JEEG 格式轉換為 PNG 格式。有多種方法可以完成這個任務。可以手動用 GIMP 打開每個圖片,輸出成新格式,但這基本是最差的選擇,費時費力。

上述方法有一個漂亮且簡潔的變種,即基于 shell 的方案:

$ convert 001.jpeg 001.png
$ convert 002.jpeg 002.png
$ convert 003.jpeg 003.png
... 略 ...

對于初學者而言,這是一個不小的轉變,而且看起來是個不小的改進。不再需要圖像界面和不斷的鼠標點擊,但仍然是費力的。

進一步改進:

$ for i in *jpeg; do convert $i $i.png ; done

至少,這一步設置好任務執行,讓你節省時間去做更有價值的事情。但問題來了,這仍然是串行操作;一張圖片轉換完成后,隊列中的下一張進行轉換,依此類推直到全部完成。

使用 Parallel:

$ find . -name "*jpeg" | parallel -I% --max-args 1 convert % %.png

這是兩條命令的組合:find 命令,用于收集需要操作的對象;parallel 命令,用于對象排序并確保每個對象按需處理。

  • find . -name “*jpeg” 查找當前目錄下以 jpeg 結尾的所有文件。
  • parallel 調用 GNU Parallel。
  • -I% 創建了一個占位符 %,代表 find 傳遞給 Parallel 的內容。如果不使用占位符,你需要對 find 命令的每一個結果手動編寫一個命令,而這恰恰是你想要避免的。
  • –max-args 1 給出 Parallel 從隊列獲取新對象的速率限制。考慮到 Parallel 運行的命令只需要一個文件輸入,這里將速率限制設置為 1。假如你需要執行更復雜的命令,需要兩個文件輸入(例如 cat 001.txt 002.txt > new.txt),你需要將速率限制設置為 2。
  • convert % %.png 是你希望 Parallel 執行的命令。

組合命令的執行效果如下:find 命令收集所有相關的文件信息并傳遞給 parallel,后者(使用當前參數)啟動一個任務,(無需等待任務完成)立即獲取參數行中的下一個參數(LCTT 譯注:管道輸出的每一行對應 parallel 的一個參數,所有參數構成參數行);只要你的主機沒有癱瘓,Parallel 會不斷做這樣的操作。舊任務完成后,Parallel 會為分配新任務,直到所有數據都處理完成。不使用 Parallel 完成任務大約需要 10 分鐘,使用后僅需 3 至 5 分鐘。

多個輸入

只要你熟悉 find 和 xargs (整體被稱為 GNU 查找工具,或 findutils),find 命令是一個完美的 Parallel 數據提供者。它提供了靈活的接口,大多數 Linux 用戶已經很習慣使用,即使對于初學者也很容易學習。

find 命令十分直截了當:你向 find 提供搜索路徑和待查找文件的一部分信息。可以使用通配符完成模糊搜索;在下面的例子中,星號匹配任何字符,故 find 定位(文件名)以字符 searchterm 結尾的全部文件:

$ find /path/to/directory -name "*searchterm"

默認情況下,find 逐行返回搜索結果,每個結果對應 1 行:

$ find ~/graphics -name "*jpg"/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth/graphics/penguin.jpg
/home/seth/graphics/IMG_0135.jpg

當使用管道將 find 的結果傳遞給 parallel 時,每一行中的文件路徑被視為 parallel 命令的一個參數。另一方面,如果你需要使用命令處理多個參數,你可以改變隊列數據傳遞給 parallel 的方式。

下面先給出一個不那么實際的例子,后續會做一些修改使其更加有意義。如果你安裝了 GNU Parallel,你可以跟著這個例子操作。

假設你有 4 個文件,按照每行一個文件的方式列出,具體如下:

$ echo ada > ada ; echo lovelace > lovelace
$ echo richard > richard ; echo stallman > stallman
$ ls -1
ada
lovelace
richard
stallman

你需要將兩個文件合并成第三個文件,后者同時包含前兩個文件的內容。這種情況下,Parallel 需要訪問兩個文件,使用 -I% 變量的方式不符合本例的預期。

Parallel 默認情況下讀取 1 個隊列對象:

$ ls -1 | parallel echoada
lovelace
richard
stallman

現在讓 Parallel 每個任務使用 2 個隊列對象:

$ ls -1 | parallel --max-args=2 echoada lovelace
richard stallman

現在,我們看到行已經并合并;具體而言,ls -1 的兩個查詢結果會被同時傳送給 Parallel。傳送給 Parallel 的參數涉及了任務所需的 2 個文件,但目前還只是 1 個有效參數:(對于兩個任務分別為)“ada lovelace” 和 “richard stallman”。你真正需要的是每個任務對應 2 個獨立的參數。

值得慶幸的是,Parallel 本身提供了上述所需的解析功能。如果你將 –max-args 設置為 2,那么 {1}和 {2} 這兩個變量分別代表傳入參數的第一和第二部分:

$ ls -1 | parallel --max-args=2 cat {1} {2} ">" {1}_{2}.person

在上面的命令中,變量 {1} 值為 ada 或 richard (取決于你選取的任務),變量 {2} 值為 lovelace 或 stallman。通過使用重定向符號(放到引號中,防止被 Bash 識別,以便 Parallel 使用),(兩個)文件的內容被分別重定向至新文件 ada_lovelace.person 和 richard_stallman.person。

$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ cat ada_*person
ada lovelace
$ cat ri*person
richard stallman

如果你整天處理大量幾百 MB 大小的日志文件,那么(上述)并行處理文本的方法對你幫忙很大;否則,上述例子只是個用于上手的示例。

然而,這種處理方法對于很多文本處理之外的操作也有很大幫助。下面是來自電影產業的真實案例,其中需要將一個目錄中的視頻文件和(對應的)音頻文件進行合并。

$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
...略...

使用同樣的方法,使用下面這個簡單命令即可并行地合并文件:

$ ls -1 | parallel --max-args=2 ffmpeg -i {1} -i {2} -vcodec copy -acodec copy {1}.mkv

簡單粗暴的方式

上述花哨的輸入輸出處理不一定對所有人的口味。如果你希望更直接一些,可以將一堆命令甩給 Parallel,然后去干些其它事情。

首先,需要創建一個文本文件,每行包含一個命令:

$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo.avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

接著,將文件傳遞給 Parallel:

$ parallel --jobs 6

現在文件中對應的全部任務都在被 Parallel 執行。如果任務數量超過允許的數目(LCTT 譯注:應該是 –jobs 指定的數目或默認值),Parallel 會創建并維護一個隊列,直到任務全部完成。

關于“Linux下怎么安裝和使用Parallel”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扬中市| 依安县| 天水市| 岚皋县| 乌苏市| 苍梧县| 广饶县| 精河县| 香格里拉县| 马关县| 南开区| 石城县| 郁南县| 武义县| 河源市| 新竹县| 铜川市| 同心县| 基隆市| 宽城| 舞钢市| 调兵山市| 蚌埠市| 阳信县| 茶陵县| 南投市| 庆城县| 普定县| 吉首市| 乐清市| 北宁市| 社会| 修文县| 阿勒泰市| 永泰县| 东丰县| 旬阳县| 土默特左旗| 万山特区| 布拖县| 伽师县|