Çok işlemcili paket (Ubuntu 12.04 on Amazon EC2 üzerinde 1.7.0 ile python 2.73) ile basit bir sayısal temelli matris cebri hesaplamaları yaparken bir sistem hatası alıyorum (aşağıda gösterilmektedir) . Kodum daha küçük matris boyutları için iyi çalışıyor ancak daha büyük olanlar için çöküyor (bol miktarda kullanılabilir bellek)Çoklu işlem kullanarak alt işlemlerin çalıştırılması sırasında sistem hatası
Kullandığım matrislerin boyutu önemli (1000000x10 float yoğun matrisler için kodum düzgün çalışıyor ancak 1000000x500 olanlar için çöküyor - I Bu matrisleri alt süreçlere/yollardan geçiriyorum). 10 vs 500 bir çalışma zamanı parametresidir, her şey aynı kalır (giriş verileri, diğer çalışma zamanı parametreleri vb.)
Ayrıca, daha büyük matrisler için python3 kullanarak aynı (taşınmış) kodu çalıştırmayı denedim alt süreçler uyku/boşta moduna geçerler (python 2.7'deki gibi çökmek yerine) ve program/alt işlemlerin hiçbir şey yapmadan orada dururlar. Daha küçük matrisler için kod python3 ile iyi çalışır.
Exception in thread Thread-5: Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run() File "/usr/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task) SystemError: NULL result without error in PyObject_Call
Multiprocessing kodu kullandığım:
herhangi bir öneriniz çok
Hata mesajı (Burada fikir gelmiyordu am) mutluluk duyacağız
Aşağıdadef runProcessesInParallelAndReturn(proc, listOfInputs, nParallelProcesses):
if len(listOfInputs) == 0:
return
# Add result queue to the list of argument tuples.
resultQueue = mp.Manager().Queue()
listOfInputsNew = [(argumentTuple, resultQueue) for argumentTuple in listOfInputs]
# Create and initialize the pool of workers.
pool = mp.Pool(processes = nParallelProcesses)
pool.map(proc, listOfInputsNew)
# Run the processes.
pool.close()
pool.join()
# Return the results.
return [resultQueue.get() for i in range(len(listOfInputs))]
olduğunu " proc "her alt işlem için çalıştırılır. Temel olarak, numpy kullanarak birçok doğrusal denklem sistemini çözer (alt süreç içinde gerekli matrisleri oluşturur) ve sonuçları başka bir matris olarak döndürür. Bir kez daha, bir çalışma zamanı parametresinin daha küçük değerleri için iyi çalışır, ancak daha büyük olanlar için çöker (veya python3'te asılı kalır).
def solveForLFV(param):
startTime = time.time()
(chunkI, LFVin, XY, sumLFVinOuterProductLFVallPlusPenaltyTerm, indexByIndexPurch, outerProductChunkSize, confWeight), queue = param
LFoutChunkSize = XY.shape[0]
nLFdim = LFVin.shape[1]
sumLFVinOuterProductLFVpurch = np.zeros((nLFdim, nLFdim))
LFVoutChunk = np.zeros((LFoutChunkSize, nLFdim))
for LFVoutIndex in xrange(LFoutChunkSize):
LFVInIndexListPurch = indexByIndexPurch[LFVoutIndex]
sumLFVinOuterProductLFVpurch[:, :] = 0.
LFVInIndexChunkLow, LFVInIndexChunkHigh = getChunkBoundaries(len(LFVInIndexListPurch), outerProductChunkSize)
for LFVInIndexChunkI in xrange(len(LFVInIndexChunkLow)):
LFVinSlice = LFVin[LFVInIndexListPurch[LFVInIndexChunkLow[LFVInIndexChunkI] : LFVInIndexChunkHigh[LFVInIndexChunkI]], :]
sumLFVinOuterProductLFVpurch += sum(LFVinSlice[:, :, np.newaxis] * LFVinSlice[:, np.newaxis, :])
LFVoutChunk[LFVoutIndex, :] = np.linalg.solve(confWeight * sumLFVinOuterProductLFVpurch + sumLFVinOuterProductLFVallPlusPenaltyTerm, XY[LFVoutIndex, :])
queue.put((chunkI, LFVoutChunk))
print 'solveForLFV: ', time.time() - startTime, 'sec'
sys.stdout.flush()
Proc işlevinin kodunu paylaşabilir misiniz? – barracel
Sadece yaptım. Proc'un argümanlarını açıklamamıştım - bunlardan bazıları matrisler, bazıları liste listesi ve bazıları sadece yüzer/tamsayılar. Her bir alt işlemden sonuçları döndürmek için sıra kullanılır. – Yevgeny