Распараллеливание кода Python с использованием многопроцессорной обработки
Я действительно новичок в мулти-обработке Python и пытаюсь распараллелить мой код, потому что его запуск занимает слишком много времени. У меня есть код, который проходит через большой кусок данных, чтобы найти, если какой-либо из файлов поврежден или нет. Пока что мой код:
def check_Corrupt_1(dirPath, logfile):
fileCheck = open(logfile, "w").close()
fileCheck = open(logfile, "w")
emptydir = []
zero_size = {}
#entering the year to be checked (day number)
for fname in os.listdir(dirPath):
if(os.listdir(os.path.join(dirPath, fname)) == []):
emptydir.append(fname)
else:
#this makes sure that we do not enter an empty directory
if fname not in emptydir:
inPath = os.path.join(dirPath, fname)
for filename in os.listdir(inPath):
hdfinfo = os.stat(os.path.join(inPath, filename))
if(hdfinfo.st_size == 0):
zero_size[filename] = True
else:
filepath = "/path/to/file"
strin = subprocess.Popen(["hdp", "dumpsds", "-h", os.path.join(inPath, filename)], stdout=subprocess.PIPE).communicate()[0]
#print(strin)
cmd = 'echo $?'
callno = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
#print(int(callno.stdout.read()[0]))
if(int(callno.stdout.read()[0]) != 0):
fileCheck.write(os.path.join(inPath, filename) + '\n')
У меня есть 365 каталогов на каждый год, и каждый каталог содержит много файлов для проверки. Я запускаю команды bash, чтобы проверить, не поврежден ли файл или нет, но из-за того, что команда bash, которую я запускаю, выводится очень долго, выполнение этого кода занимает много времени. Я надеюсь, что распараллеливание поможет сделать это быстрее, но я не понимаю, как это сделать. Есть ли другой способ сделать это быстрее, чем многопроцессорность? Буду признателен за любую помощь.
1 ответ
Из краткого обзора вашей рецензии и сегмента кода, который вы разместили, кажется, что большая часть тяжелой работы, кажется, выполняется через hdp
команда. Так что это тот, который вы хотите parallelize
, То, что вы делаете, это открытие подпроцесса. Вы также можете попробовать использовать темы. Ваш код будет что-то вроде этого
#!/usr/bin/python
import thread
from subprocess import call
def check_Corrupt_1(dirPath, logfile):
fileCheck = open(logfile, "w").close()
fileCheck = open(logfile, "w")
emptydir = []
zero_size = {}
#entering the year to be checked (day number)
for fname in os.listdir(dirPath):
if(os.listdir(os.path.join(dirPath, fname)) == []):
emptydir.append(fname)
else:
#this makes sure that we do not enter an empty directory
if fname not in emptydir:
inPath = os.path.join(dirPath, fname)
for filename in os.listdir(inPath):
hdfinfo = os.stat(os.path.join(inPath, filename))
if(hdfinfo.st_size == 0):
zero_size[filename] = True
else:
try:
thread.start_new_thread(call(["hdp", "dumpsds", "-h"]))
except:
print "Error generating thread"
if(int(callno.stdout.read()[0]) != 0):
fileCheck.write(os.path.join(inPath, filename) + '\n')