Given that there's a lot in your head about your application that I don't 
know, perhaps I should stop guessing about what you're trying to do and just 
make sure the principles are clear:

1. The more data you have to serialize and send to other processes, the slower 
it will be. The key thing about a SharedArray is that it uses a couple tricks 
to serialize the "container" without needing to serialize the data---but 
that's the only thing special about it.
2. A type that contains non-immutable types (e.g., Arrays) only stores 
references to those objects. So
type MyType{T}
    A::SharedArray{T,2}
    b::SharedArray{T,1}
end
should serialize very nicely, because a "MyType" object is, in itself, tiny 
(if you know C, think of it essentially as 2 pointers) and the big parts (the 
SharedArrays) serialize nicely.

I worry, though, that your array-of-tuples will prove troublesome, because 
each one of those is in turn a reference to an object which would need to be 
serialized. If they are all of the same size and you need to serialize it, you 
should consider a different structure (e.g., a SharedArray of immutables).

--Tim


On Wednesday, May 07, 2014 12:52:59 PM Bob Quazar wrote:
> 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