【发布时间】:2015-01-15 13:47:55
【问题描述】:
我有一个使用 clojure 的 ETL,每个线程可以加载文件的不同部分,并且还需要从业务密钥中获取密钥。存储业务键到键映射的数据结构是一个哈希映射,例如:
{"businessKey1" 1,
"businessKey2" 2,
"businessKey3" 3,
"businessKey4" 4,
"businessKey5" 5 }
ETL从文件中加载数据时,会将文件中的每一行解析成列,如果在map中可以找到业务key列,则返回key,例如找到businessKey1,则返回1。找到businessKey6,然后需要调用一个Web服务来创建一个新的密钥。我打算用atom,所以当每个线程找到一个新的key时,用atom来修改map。但性能非常糟糕。我测试了下面的代码,速度很慢,而且有很多GC活动。
(def a (atom {}))
(map #(swap! a (partial merge {% 1})) (range 10000))
(println a)
对此最好的解决方案是什么?我应该在 java 中使用 ConcurrentHashMap 吗?
【问题讨论】:
-
“非常慢”是什么意思?由于地图是不可变的数据结构,很多 GC 活动是可以理解的,因为代码在每个
merge上创建一个新地图。也就是说,GC 可能不是瓶颈的根源,因为有一个原子正在被修改并且需要同步。
标签: clojure