我有一个非常大的矩阵M
(大约5 Gig),并且必须在f: Column -> Column
的每一列上执行操作M
。
我想我应该使用pmap
(如果我错了,请纠正我),但据我所知,我应该给它一个矩阵列表。如何有效地处理M
以便将其传递给pmap
?
第二个问题是f
是否可以同时使用多列。
答案 0 :(得分:2)
我认为为此尝试SharedArray可能是个好主意。更好的是多线程而不是Julia当前的多处理,但这还没有发布。
f
应该引用矩阵和列的列,而不是列本身,以避免复制。
编辑:这是我尝试SharedArray
的例子 - 我之前从未使用过它,所以它写得很糟糕。
addprocs(3)
@everywhere rows = 10000
@everywhere cols = 100
data = SharedArray(Float64, (rows,cols))
@everywhere function f(col, data)
for row = 1:rows
new_val = rand()*col
for dowork = 1:10000
new_val = sqrt(new_val)^2
end
data[row,col] = new_val
end
end
tic()
pmap(g->f(g...), [(col,data) for col in 1:cols])
toc()
for i = 1:10:cols
println(i, " ", mean(data[:,i]), " ", 0.5*i)
end
tic()
map(g->f(g...), [(col,data) for col in 1:cols])
toc()
带输出
elapsed time: 24.454875168 seconds
1 0.49883655930753457 0.5
11 5.480063271913496 5.5
21 10.495998948926 10.5
31 15.480227440365235 15.5
41 20.70105670567518 20.5
51 25.300540822213783 25.5
61 30.427728439076436 30.5
71 35.5280001975307 35.5
81 41.06101008798742 40.5
91 45.72394376323945 45.5
elapsed time: 69.651211534 seconds
所以我们正如预期的那样获得大约3倍的加速。在作业运行的时间越长,它越接近理想,因为可能有一些JIT预热时间。