I don't need to modify any of the data, so I could use immutable. Would you 
recommend using tuples then, as fields in my immutable composite type, 
rather than arrays? I tried that, but one of my arrays has about 3,000,000 
entries (and each entry is itself a tuple); ntuple doesn't seem designed to 
handle this much data. 

w2 = ntuple(length(myArray), (j) -> myArray[j])
ERROR: stack overflow
 in ntuple at tuple.jl:30 (repeats 74810 times)
 in ntuple at tuple.jl:29

Is there an alternative way to constructing immutable arrays?

Thanks much, Bob




On Wednesday, May 7, 2014 3:38:45 AM UTC-7, Tim Holy wrote:
>
> Given your current design, reinterpret (which is indeed the same thing as 
> casting) is not going to work for you, as least not without a lot of 
> hacking 
> on your part. Can you use an immutable? The key point is that an immutable 
> has 
> a predictable layout in memory. For that to work, your arrays would have 
> to be 
> of fixed size. 
>
> In the memory layout of immutables, one thing you have to be aware of is 
> that 
> sometimes "gaps" are introduced for the purpose of memory-alignment. 
> (These 
> can also be platform-dependent, I believe, but if you're not transferring 
> data 
> from one machine to another this shouldn't be a problem.) Here's a demo, 
> in 
> case it's of any value to you: 
>
> julia> immutable MyArray 
>            x::Uint16 
>            y::Uint16 
>            z::Uint16 
>        end 
>
> julia> immutable MyType 
>            a::MyArray 
>            c::Char 
>            d::Float64 
>        end 
>
> julia> sizeof(MyType) 
> 24 
>
> julia> r = [uint8(1:24)] 
> 24-element Array{Uint8,1}: 
>  0x01 
>  0x02 
>  0x03 
>  0x04 
>  0x05 
>  0x06 
>  0x07 
>  0x08 
>  0x09 
>  0x0a 
>     ⋮ 
>  0x0f 
>  0x10 
>  0x11 
>  0x12 
>  0x13 
>  0x14 
>  0x15 
>  0x16 
>  0x17 
>  0x18 
>
> julia> reinterpret(MyType, r) 
> 1-element Array{MyType,1}: 
>  MyType(MyArray(0x0201,0x0403,0x0605),'\Uc0b0a09',1.2650169649295773e-192) 
>
>
> On Tuesday, May 06, 2014 09:57:27 PM Bob Quazar wrote: 
> > Tim, Thanks for the response. 
> > 
> > How can I determine whether my structure (a composite type) is a 
> contiguous 
> > block of memory? The composite type has a few fields. One of the fields 
> has 
> > type Array{Array{Uint16,1},1} and another has type 
> > Array{Array{Float64,2},1}. Am I out of luck? 
> > 
> > What does it mean to reinterpret a composite type as a 
> > SharedArray{Uint8,1}? Is that something like casting? 
> > 
> > On Tuesday, May 6, 2014 7:32:47 PM UTC-7, Tim Holy wrote: 
> > > If your structure is a contiguous block of memory, you could 
> presumably 
> > > use a 
> > > SharedArray{Uint8,1} and then reinterpret it as your custom object. 
> But if 
> > > you 
> > > want independently garbage-collectable constituents, this is not 
> likely to 
> > > be 
> > > feasible. 
> > > 
> > > --Tim 
> > > 
> > > On Tuesday, May 06, 2014 03:03:01 PM Bob Quazar wrote: 
> > > > In Julia, is it possible to share read-only data structures between 
> > > > threads/processes running on different processors, without making a 
> copy 
> > > 
> > > of 
> > > 
> > > > the entire data structure for each thread? The data structure I need 
> to 
> > > > share isn't of "bit type", so I can't use a SharedArray. And each 
> worker 
> > > > needs to read random parts from the full data structure, so I can't 
> use 
> > > 
> > > a 
> > > 
> > > > distributed array. I also tried just putting "@parallel" before a 
> for 
> > > 
> > > loop, 
> > > 
> > > > whose body accesses the data structure I want to share, but I 
> believe 
> > > 
> > > the 
> > > 
> > > > whole data structure gets copied at each iteration. (I could be 
> wrong 
> > > 
> > > about 
> > > 
> > > > that, but it's certainly very slow.) Does Julia have some 
> alternative to 
> > > 
> > > a 
> > > 
> > > > copy-on-write for sharing data between threads? 
> > > > 
> > > > Thanks in advance! 
> > > > 
> > > > --Bob 
>

Reply via email to