0

我正在使用 java 中的多线程进行并行计算。可能的数据结构是HashMap。我的算法没有任何除法运算和平方根。它是随机梯度下降。即使这样我也得到了NaN。我想知道是否有多重访问,在 hashmap 中读写,它会导致任何未定义的问题吗?如果是,我将如何摆脱它?

[编辑]

for(Map.Entry<Integer, ArrayList<Double>>entry: Matrix.entrySet()){
        sum = sum + Math.exp(getScore(contextFeatureVector,entry.getValue()));
    }

getScore方法计算内积。返回值为infinity

[编辑 2]

在上述方法中,Matrix是:

  Map<Integer,ArrayList<Double>> Matrix = new ConcurrentHashMap<Integer,ArrayList<Double>>();

我仍然得到NaN。是因为我访问价值的方式。有人可以用清晰的直觉回答吗?

4

1 回答 1

2

如果要让两个线程从那里添加和删除条目,则应该使用 java.util.concurrent.ConcurrentHashMap。当您的一个线程删除另一个线程刚刚得到一个handel并调用键值的键时,您将成为NaN。

或者您可以在添加/删除条目时阻止 HashMap 对象。

[编辑] 几个想法:

• 整数可能不太可靠同步。(除非您做额外的工作以确保您没有两个 Integer 具有相同的值,因此您必须跟踪并重用 Integer。)

• NaN 表示您最有可能得到一个数字的 nil。• 除以0 • 计算负数的sqrt。

• NaN != 无穷大

您可以在使用它们时将值记录到控制台,或者只是找到您抛出 exption 的行。也许只是转储整个地图。

你现在拥有的这张地图是要走的路,但你需要确保它开始做它需要做的事情。

于 2012-07-21T13:27:30.143 回答