Проблема с многопроцессорным пулом в python - PullRequest
1 голос
/ 10 мая 2019

В моем коде python есть цикл For, который читает файлы из большого списка имен файлов, читает информацию из этих файлов и затем записывает эту информацию в Numpy.ndarray.Я понял, что цикл for занимает много времени, и я могу сэкономить время, распараллеливая этот процесс, используя Multiprocessing.Pool()

. Вот цикл for, который я хотел распараллелить, выглядит следующим образом (фактический кодразные),

Matrix = [[0,0,0],[0,0,0],......[0,0,0]]
#a 2D numpy array of Zeros, this is where we want to write information to.

FileList = [file1,file2,file3....,fileN]
# a list containing the file names

for index in range (0,len(FileList)) :

   Data = ReadDataFromFile(FileList[index])
   #read some information from the file to the variable Data

   Matrix[M][N] = Data 
   # the value of Data is written to the MNth element of the matrix

Я пытался распараллелить это, то есть вместо того, чтобы система считывала по одному файлу за раз, я хотел, чтобы он читал как можно больше файлов параллельно.

Я не смог найти способ распараллелить цикл For, поэтому, следуя некоторым примерам, которые мы видели в Stackoverflow, я написал цикл For в виде функции, а затем использовал из multiprocessing.Pool.map().

функциюпринимает имя файла в качестве входных данных, читает информацию из файла, как указано выше, а затем записывает эту информацию в Numpy.ndarray, который уже определен. Внутри функции я импортировал массив как global, чтобы изменения, сделанные внутрифункция будет доступна за пределами функции.

def GetDataFromFile(filename) :

    global Matrix 
    #calling Matrix as global variable

    Data = ReadData(filename) 

    Matrix[M][N]
    #writing information to global Matrix

при вызове функция работает нормально и записывает информацию в массив из файла.

Но когда я пытался распараллелить процесс с multiprocessing. Pool.map()

он не работает должным образом, то есть изменения, сделанные функцией 'GetDataFromFile', не изменяют значения ndarray глобально.

import multiprocessing
p = multiprocessing.Pool()

Matrix = [[0,0,0],[0,0,0],......[0,0,0]]
#a 2D numpy array of Zeros, this is where we want to write information to.

FileList = [file1,file2,file3....,fileN]

def GetDataFromFile(filename) :

    global Matrix 
    #calling Matrix as global variable

    Data = ReadData(filename) 

    Matrix[M][N] 
    #writing information to global Matrix

p.map(GetDataFromFile,FileList)
print Matrix

Вывод вышеприведенного кода дает все нули, то есть функция не добавляет информацию в ndarray при использовании с multiprocessing.Pool.map().

В чем здесь проблема?Как мы можем это исправить?Есть ли альтернативный способ добиться того же?

Заранее спасибо, я использую Python2.7 на Ubuntu 16.04 LTS.

...