Пытаюсь осилить мультипоточность под многоядерные процы на питоне. Накатал 2 версии через Pool и через Thread, ни одна не работает.
Помогите исправить код, чтобы он эффективно работал на многоядернике.
Есть простой код бинарного сравнения двух толстых файлов. Если брать большой размер блоков (piece_size), то скорость упирается в скорость хдд. Если брать маленький размер блока, то уже сильно проседает процессор и скорость чтения с диска падает. Делаю вывод, что узким местом является операция сравнения двух частей:
from time import time
piece_size = 16 # KB
# cores in system
multiplier = 4
errors = 0
starttime = time()
# 2 equal by size, but different by content files
file1 = open('etalon.mkv', 'rb')
file2 = open('startplus.mkv', 'rb')
# get byte piece of 2 files, and compare them
def check(r1, r2, i):
global errors
if r1[i:i + piece_size] != r2[i:i + piece_size]:
errors += 1
return
if __name__ == '__main__':
r1 = file1.read(piece_size * multiplier)
r2 = file2.read(piece_size * multiplier)
while r1:
# give piece * 4 size, and work with every piece separately
for i in range(0, piece_size * multiplier, piece_size):
check(r1, r2, i)
r1 = file1.read(piece_size * multiplier)
r2 = file2.read(piece_size * multiplier)
print('errors:', errors)
print('Running time: ', time() - starttime)
Попытка реализации через Pool: http://pastebin.com/u6C2tcbt
Итог: Скорость чтения с диска 0 mb/s, 4 подпроцесса в 2% cpu, 1 процесс в 25% cpu
Попытка реализации через Thread: http://pastebin.com/xkHJwkm1
Итог: Скорость чтения с диска 0 mb/s, 1 процесс в 30% cpu