我在java中使用multhi-threading进行并行计算。可能数据结构是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
。这是因为我获取价值的方式。有人可以用清晰的直觉回答吗?
答案 0 :(得分:2)
如果您要在其中添加和删除条目,则应该使用java.util.concurrent.ConcurrentHashMap。当你的一个线程删除了另一个线程刚刚获得handel并且将为key调用value时,你将成为NaN。
或者,您可以在添加/删除条目时阻止HashMap对象。
[编辑] 几点想法:
•整数可能在同步时不太可靠。 (除非你的 做额外的工作,确保你没有两个Integer for 相同的值,因此您必须跟踪并重用Integer。)
•NaN意味着您最有可能获得一个数字为零。 •除以0 •计算负数的sqrt。
您是否可以在使用它们时记录值到控制台,或者只是找到引发exption的行。也许只是抛弃整个地图。
你现在拥有的这张地图是要走的路,但是你需要确保它能够做到这一点。