I think you missed his point. (assoc! m k v) is *allowed* to modify m, not *guaranteed*. It returns a pointer to a transient map, which may be m, or may be a totally distinct map, or may be a new map that shares some pointers with m. So your (do (update! blah foo bar) ...more stuff) is potentially (and unpredictably) throwing away the results of the update. You need to save the return value.
On Nov 5, 11:48 am, "pepijn (aka fliebel)" <pepijnde...@gmail.com> wrote: > update! is of my own making, based on assoc! and update-in > > On Nov 5, 7:30 pm, B Smith-Mannschott <bsmith.o...@gmail.com> wrote: > > > On Fri, Nov 5, 2010 at 17:38, pepijn (aka fliebel) > > > <pepijnde...@gmail.com> wrote: > > > I will have a look around. > > > > I listed the map I used in my first email, It's on my Dropbox: > > >http://dl.dropbox.com/u/10094764/World2.zip > > > > Meanwhile I wrote a function that is already twice as fast as I had, > > > no memory problems, no threads. One tinny problem: it doesn't produce > > > the same result. > > > > It's the one at the top:https://gist.github.com/663096 > > > > The other day I found out that this kind of logic will actually refer > > > to the same same transient. This eliminates the remainder and associng > > > in the areduce fn second in the list, but I'm not sure this is > > > reliable, and it might be the reason why some results get lost. > > > (defn freqs [^bytes blocks] > > (loop [idx 0 > > ret (cycle (repeatedly 128 #(transient {})))] > > (if (< idx (alength blocks)) > > (do > > (update! (first ret) (aget blocks idx) (fnil inc 0)) > > (recur (inc idx) (next ret))) > > (map persistent! (take 128 ret))))) > > > I'm not familiar with incanter, which defines update!, but the update! > > call makes me suspicious. Transients are not designed to be banged on > > in place. That would explain your losing results. > > > // ben > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en