为什么SharedArray的SetIndex抱怨不可变类型?

时间:2016-05-08 18:35:28

标签: types casting multiprocessing julia shared-memory

所以我有一个非常简单的问题。我有一个类型定义如下:

# An internal type used only by the train function for caching between epochs.
immutable Residual
    value::Float32
    curr_error::Float32
    prev_error::Float32
end

我正在研究Julia中的机器学习算法,并想在@parrellel循环结束时检查这些值。为实现这一点,我使用的是像这样定义的SharedArrays。

residuals = SharedArray(Residual, size(rating_set.training_set), init = S -> S[Base.localindexes(S)] = [Residual(rating.value, 0.0, 0.0) for rating in rating_set.training_set[Base.localindexes(S)]])

现在,在循环内部,我想通过简单的更新步骤更新残差。由于它是不可变的,我假设我必须创建一个新的Residual对象并将其填充到SharedArray中。

residual[j] = Residual(residual.value, -user_feature * item_feature + residual.value, residual.curr_error)

但是,每当我运行代码时,我都会收到以下错误。

LoadError: MethodError: `setindex!` has no method matching setindex!(::Residual, ::Residual, ::Int64)

我不确定我做错了什么,我认为它与打字有关?或者我只是完全误解Julia中的SharedArrays?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

嗯,这很令人尴尬,我在数组中留下了一个s,所以它试图在不可变类型上设置索引......我会在这里留下这个问题以防其他人犯同样的错误