I passed it as an argument from the REPL. I made a test script where I 
hardcode these things to make sure its not global, but the allocation 
remains. 
In this gist there is the code with allocations and @time result for the 
double for loop as well as the vectorised version:
https://gist.github.com/timlod/6a2324db4d01dc07dd5a


On Sunday, 13 March 2016 13:36:10 UTC+1, tshort wrote:
>
> Where does your variable `dims` come from? As pointed out above, global 
> variables can hurt type inference.
> On Mar 13, 2016 8:29 AM, "Tim Loderhose" <ti...@hotmail.de <javascript:>> 
> wrote:
>
>> I implemented the suggestions (see updated gist: 
>> https://gist.github.com/timlod/0f607e311d0464fd6c63).
>> The allocation in the for loops disappeared and the time required halved 
>> to ~3s. The mmap access though still allocated a lot.
>> And the vectorised access is still much faster and allocates less 
>> (although I want to get rid of the allocation altogether).
>> Any other ideas?
>>
>> On Saturday, 12 March 2016 15:15:51 UTC+1, Dan wrote:
>>>
>>> Yep, `peCounters`, `paCounters` and `dims` are not type-stable. They are 
>>> one type by their default values and then assigned another. Perhaps rename 
>>> the default parameters, and copy them to `peCounters`, `paCounters` and 
>>> `dims` only if they are set to something other than `0`.
>>>
>>> Also, `mdhcounters` might not return a definite type (need to check that 
>>> function).
>>> Fixing these should make the loop efficient.
>>>
>>> On Saturday, March 12, 2016 at 4:05:39 PM UTC+2, Tim Loderhose wrote:
>>>>
>>>> Here's the actual code: 
>>>> https://gist.github.com/timlod/0f607e311d0464fd6c63 
>>>> <https://www.google.com/url?q=https%3A%2F%2Fgist.github.com%2Ftimlod%2F0f607e311d0464fd6c63&sa=D&sntz=1&usg=AFQjCNHB4_Itk64Xevbo5RACmmrF0lsgBA>
>>>>
>>>> I am running the code from the REPL, may that be a problem? (As I read 
>>>> in the REPL everything is global). In the file nothing is global.
>>>> Also, the counters are UInt16s, but that shouldnt matter I guess.
>>>>
>>>> Thanks for the help so far!
>>>>
>>>> On Saturday, 12 March 2016 14:22:38 UTC+1, Dan wrote:
>>>>>
>>>>> It's better to have code which actually runs in the post. In any case, 
>>>>> the allocations at the `for` lines is suspicious - the for should 
>>>>> basically 
>>>>> only allocate a counter. Are there any global variables? Is `counter1` or 
>>>>> `counter2` or `dims` global? Globals are always a good source of 
>>>>> confusion 
>>>>> to the type-inference engine.
>>>>>
>>>>> On Saturday, March 12, 2016 at 2:28:51 PM UTC+2, Tim Loderhose wrote:
>>>>>>
>>>>>> 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" <ti...@hotmail.de> 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
>>>>>>>>>>
>>>>>>>>>

Reply via email to