我有多個gz文件,總大小約爲120GB。我想將這些文件解壓(gzip)到相同的目錄並刪除現有的gz文件。目前我們正在手動完成,並且需要更多時間來使用gzip -d <filename>
解壓縮。
有沒有辦法通過創建python腳本或任何其他技術來並行解壓縮這些文件。目前這些文件在Linux機器上。如何使用多線程解壓縮python中的多個gz文件?
回答
使用gunzip
或gzip -d
解壓文件的大部分掛鐘時間將來自I/O操作(讀取和寫入磁盤)。它甚至可能比實際解壓縮數據所耗費的時間更多。您可以通過在後臺運行多個gzip作業來利用此優勢。由於某些作業在I/O上被阻塞,所以另一項作業可以實際運行而無需在隊列中等待。
通過在後臺運行多個gunzip
進程,可以加快整個文件集的解壓縮速度。每個服務一組特定的文件。
你可以在BASH中簡單地打個比方。將文件列表拆分爲單獨的命令,並使用&
將其作爲後臺作業啓動。然後wait
爲每個工作完成。
我會建議你有2到2 * N個就業機會。其中N是計算機上的核心數或邏輯處理器數。適當地進行試驗以獲得正確的數字。
您可以在BASH中輕鬆地調出某些東西。
#!/bin/bash
argarray=("[email protected]")
len=${#argarray[@]}
#declare 4 empty array sets
set1=()
set2=()
set3=()
set4=()
# enumerate over each argument passed to the script
# and round robin add it to one of the above arrays
i=0
while [ $i -lt $len ]
do
if [ $i -lt $len ]; then
set1+=("${argarray[$i]}")
((i++))
fi
if [ $i -lt $len ]; then
set2+=("${argarray[$i]}")
((i++))
fi
if [ $i -lt $len ]; then
set3+=("${argarray[$i]}")
((i++))
fi
if [ $i -lt $len ]; then
set4+=("${argarray[$i]}")
((i++))
fi
done
# for each array, start a background job
gzip -d ${set1[@]} &
gzip -d ${set2[@]} &
gzip -d ${set3[@]} &
gzip -d ${set4[@]} &
# wait for all jobs to finish
wait
在上面的例子中,我選擇了每個作業4個文件並開始兩個單獨的作業。您可以輕鬆擴展腳本以獲得更多作業,每個進程有更多文件,並將文件名稱作爲命令行參數。
你可以用multiprocessing Pools做到這一點很容易:
import gzip
import multiprocessing
import shutil
filenames = [
'a.gz',
'b.gz',
'c.gz',
...
]
def uncompress(path):
with gzip.open(path, 'rb') as src, open(path.rstrip('.gz'), 'wb') as dest:
shutil.copyfileobj(src, dest)
with multiprocessing.Pool() as pool:
for _ in pool.imap_unordered(uncompress, filenames, chunksize=1):
pass
該代碼將產生幾道工序,每道工序都會在同一時間提取一個文件。
在這裏,我選擇了chunksize=1
,以避免拖延過程,如果一些文件大於平均水平。
嗨安德烈,謝謝你的回覆。所以如果我理解得當。我們一次處理4個文件的權利?如果一個文件完成,它會選擇下一個文件(第5個文件)。請確認。 – user3743797
@ user3743797:這是正確的 –
感謝您的確認,如果我不想硬編碼的文件,而不是傳遞目錄位置,以便它會拿起files.Does池。imap_unordered方法接受目錄位置作爲文件名的輸入? – user3743797
- 1. 如何用Python解壓縮7-Zip.gz(.gz)?
- 2. 如何解壓多個文件.gz塊與塊python
- 3. 使用C解壓縮.gz文件#
- 4. 使用R解壓縮gz文件
- 5. 使用GZipStream解壓縮.gz文件
- 6. 如何使用子進程在python中解壓gz文件
- 7. 如何使用GZipStream解壓縮內存中的gz文件?
- 8. 如何將許多.gz文件解壓到同一個文件?
- 9. 使用python解壓縮.gz文件的一部分
- 10. 在Python中解壓縮遠程.gz文件
- 11. 將一個.gz文件拆分爲多個1GB壓縮(.gz)文件
- 12. Java中的多線程解壓縮
- 13. 如何使用PHP解壓縮.gz文件?
- 14. iOS ::如何使用GZIP Utility解壓縮.gz文件?
- 15. 如何使用python腳本在linux中壓縮多個文件?
- 16. 使用ZipFile類從多個文件的zip壓縮文件解壓縮文件
- 17. 如何使用Delphi將多個文件壓縮到單個壓縮文件中
- 18. 如何使用Zend壓縮過濾器壓縮多個文件?
- 19. 解壓縮.gz文件作爲目錄
- 20. 批量解壓縮.gz文件
- 21. 如何在Python中讀取.gz壓縮文件的內容?
- 22. 如何用CBZip2OutputStream壓縮多個文件
- 23. 如何使用VBscript解壓縮多個zip文件夾?
- 24. 在JRuby中使用Gem解壓縮文件(.gz)
- 25. 在c中壓縮和解壓縮多個文件#
- 26. ZLib解壓縮包含多個文件
- 27. 如何閱讀從URL進行Gz壓縮的CSV文件 - Python
- 28. 如何解壓縮多個目錄中的.zip文件?
- 29. 批量使用7zip在一個壓縮文件中壓縮更多文件,而不是在更多壓縮文件中壓縮更多文件
- 30. 使用zlib壓縮多個文件
感謝您的回覆,但我想自動執行此過程。假設我的目錄中有50個文件,那麼我希望將這些文件解壓縮爲並行,以便我可以減少時間。目前,我有文件名與標準序列號01至50所以我傳遞前10個文件在一個gzip命令像明智我有5個進程。所以我想創建一個線程的前5個工作,如明智我可以啓動10個線程。我的問題是可能在Python? – user3743797
有了一點bash腳本,你可以得到這個。將bash腳本的命令行參數轉換爲數組。然後分成4個獨立的數組。每個數組成爲一個單獨的'gzip -d'調用。我會看看我以後能不能繼續工作...... – selbie
@ user3743797 - 現在可以工作了。你可以調用'script.sh * .gz'或者它將完成你想要的。我建議將腳本放在與您要操作的文件集不同的目錄中。 – selbie