Распараллеливание кода 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')
Другие вопросы по тегам