В моем коде 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.