The code is in a function. I changed the names a bit to make it more understandable. The actual function is longer and has different variable names.
On Saturday, 12 March 2016 13:01:28 UTC+1, tshort wrote: > > Is that code in a function? (It should be.) Also, one of your variable > names changed to `counter1s`. Suspect a type instability. > On Mar 12, 2016 4:12 AM, "Tim Loderhose" <[email protected] <javascript:>> > wrote: > >> I tried around with that a bit, but then it gets much worse: From ~1s to >> ~6s, allocation as shown: >> >> 153710487 mat = Array{Complex64}(dims...) >> 4722450 file = Mmap.mmap(filename, Array{Complex64,2}, >> (dims[2],length(counter1))) >> 9568 for i = 1:dims[2] >> 4000 for j = 1:length(counter1) >> 1690462534 mat[counter1s[j],i,counter2[j]] = file[i,j] >> - end >> >> I swapped the for loops around here, but that didn't matter. I can gain a >> little bit by indexing i into the first dimension of mat, but it still lags >> far behind. >> Any other ideas? >> >> On Saturday, 12 March 2016 03:15:33 UTC+1, Greg Plowman wrote: >>> >>> I think array slices (on right hand side of assignment) create new >>> arrays, hence the allocation. >>> Try writing an explicit loop instead, something like: >>> >>> for j = 1:length(counter1) >>> for i = 1:size(file,1) >>> mat[counter1[j],i,counter2[j]] = file[i,j] >>> end >>> end >>> >>> >>> On Saturday, March 12, 2016 at 12:25:00 PM UTC+11, Tim Loderhose wrote: >>> >>>> Hi, >>>> >>>> I have a question regarding some allocation in my code I would like to >>>> get rid of. >>>> I am memory mapping a file (which could be very large) which is part of >>>> a complex 3D matrix, and then put its contents into the preallocated >>>> matrix >>>> along the second dimension. I need the counters because the contents of >>>> file are only a subset of the full matrix. >>>> >>>> Here's a profiled snippet, where the file which is loaded has 120619520 >>>> bytes. >>>> >>>> 153705063 mat = Array{Complex64}(dims...) >>>> 4721282 file = Mmap.mmap(filename, Array{Complex64,2}, >>>> (dims[2],length(counter1))) >>>> 16 for i = 1:length(counter1) >>>> 148179531 mat[counter1[i],:,counter2[i]] = file[:,i] >>>> - end >>>> >>>> Why does the code allocate so much memory inside the for-loop (even >>>> more bytes than the contents of file)? >>>> It seems like this is a trivial matter, right now I just can't get my >>>> head around it, any help is appreciated :) >>>> >>>> Thanks, >>>> Tim >>>> >>>
