У меня есть несколько файлов gz с общим размером около 120 ГБ. Я хочу разархивировать (gzip) эти файлы в тот же каталог и удалить существующий gz-файл. В настоящее время мы делаем это вручную, и у вас больше времени на распаковку, используя gzip -d <filename>
.
Есть ли способ, которым я могу разархивировать эти файлы параллельно, создав скрипт python или любую другую технику. В настоящее время эти файлы находятся на машине Linux.Как распаковать несколько файлов gz в python, используя многопоточность?
ответ
Большая часть времени настенных часов, потраченная на распаковку файла с gunzip
или gzip -d
, будет осуществляться из операций ввода-вывода (чтение и запись на диск). Это может быть даже больше, чем время, затрачиваемое на декомпрессию данных. Вы можете воспользоваться этим, имея несколько заданий gzip, идущих в фоновом режиме. Поскольку некоторые операции блокируются при вводе-выводе, другое задание может выполняться без ожидания в очереди.
Вы можете ускорить процесс распаковки всего набора файлов, выполнив несколько фоновых процессов 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: это правильно –
Спасибо за подтверждение, что если я не хочу жестко кодировать файлы, а не передавать местоположение каталога, чтобы он взял файлы.Метод imap_unordered принимает местоположение каталога как вход для имен файлов? – user3743797
- 1. Как распаковать gz-файл с помощью Python
- 2. Распаковать несколько ZIP-файлов в каталог?
- 3. распаковать файл .gz в партии
- 4. Как распаковать несколько файлов?
- 5. Как распаковать gz-файлы в ssis
- 6. Как распаковать несколько ZIP-файлов
- 7. Ant: распаковать несколько файлов
- 8. Как распаковать файл .gz в swift?
- 9. Сплит .gz-файл в несколько сжатых (.gz) файлов 1GB
- 10. Python обработка файлов многопоточность
- 11. Как обрабатывать несколько файлов .gz через искрообразование?
- 12. как распаковать мой файл с расширением .gz
- 13. Трубные несколько файлов (GZ) в программе C
- 14. zgrep несколько файлов gz в каталоге
- 15. Python: Загрузите несколько файлов .gz с одного URL
- 16. Как я распаковать несколько файлов из MemoryStream
- 17. Как распаковать/распаковать файл .z
- 18. выберите несколько файлов, используя glob в python
- 19. Как загрузить и распаковать файл Sitemap gz в C#?
- 20. Как извлечь несколько файлов .gz (Архивы), не зная имя файла?
- 21. Python - разархивировать .gz файлы параллельно
- 22. Как использовать подпроцесс для распаковки gz-файла в python
- 23. Многопоточность в Python для чтения файлов
- 24. Сортировка .gz файлов в каталоге
- 25. Как я могу распаковать файл .gz с помощью PHP?
- 26. Многопоточность/многопроцессорность в Python
- 27. Файл декомпрессии удаленного .gz в Python
- 28. Загрузите .gz-файл, используя запросы в Python Error
- 29. Python: распаковать и распаковать файлы .Zip .zip
- 30. Python - распаковать структуру на несколько кортежей
Спасибо за ваш ответ, но я хочу автоматизировать этот процесс. Предположим, у меня есть 50 файлов в моем каталоге, тогда я хочу, чтобы они были распакованы параллельно, чтобы я мог уменьшить время. В настоящее время у меня есть имена файлов со стандартными порядковыми номерами из 01 до 50, поэтому я прохожу первые 10 файлов в одной команде gzip, например мудрый, у меня 5 процессов. Поэтому я хочу создать поток для первых 5 заданий, например мудрый, я могу запустить 10 потоков. Мой вопрос в том, возможно ли это в python? – user3743797
С небольшим количеством скриптов bash вы можете получить это. Преобразуйте параметры командной строки вашего скрипта bash в массив. Затем разделите на 4 отдельных массива. Каждый массив становится отдельным вызовом 'gzip -d'. Я посмотрю, смогу ли я что-нибудь поработать позже ... – selbie
@ user3743797 - теперь это работает. Вы можете вызывать 'script.sh * .gz' или он будет делать именно то, что вы хотите. Я предлагаю иметь сценарий в отдельном каталоге из набора файлов, на которых вы хотите работать. – selbie