Boost logo

Boost :

Subject: Re: [boost] Updated performance resultsusing BoostSerialization 1.41
From: Robert Ramey (ramey_at_[hidden])
Date: 2009-12-09 15:51:00


Kim Barrett wrote:
> On Dec 7, 2009, at 7:08 PM, Robert Ramey wrote:
...
>> So, to my way of thinking, that's the real solution.
>
> While that is an interesting solution to some problems, I don't
> think it actually helps with my use-cases (multiple).
>
> As mentioned earlier, turning off pointer tracking is not an
> option for me in some cases. I can envision various ways to deal
> with that. If one had a means for determining whether serializing
> a data structure used or would use tracking one could use this
> approach now, with no [further] changes to the serialization
> library.
>
> However, none of my existing use-cases are stream oriented. They
> are instead all transaction / packet oriented. This means there
> needs to be a clear boundry, where all output to be generated by
> the archive has been flushed to the buffer collecting the data,
> any "end of archive" data needs to be written, and the next
> transaction / packet needs to include any "beginning of archive"
> data needs to be written again. Right now I'm accomplishing that
> by deleting the old archive and creating a new one. I'm looking
> for either a lighter weight alternative to that (preferably), or
> a way to make that delete / recreate lighter weight.

Hmmm - Faced with this,

struct transaction {
    transaction(data1 &d1, datad &d2, ....)
    // or
    transaction(data1 d1, data2 d2, ...)
    template<class Archive>
    void serialize(Archive &ar, const unsigned int version){
        ar & d1;
        ar & d2;
        ...
    }
};

I would think the most natural solution would be:

So on the sending side:

main(.){
    tcpostream tos;
    text_oarchive oa(tos)
    loop(){
        transaction(d1, d2, ..) t;
        oa << t;
    }
}

And recieving side

main(.){
    tcpistream tis;
    text_iarchive ia(tis)
    while(tis.open()){
        transaction(d1, d2, ..) t;
        ia >> t;
    }
}

The only fly in this ointment is that tracking will imply that
only the first transaction data is actually sent. So to
implement this - only tracking has to be surpressed.

This is related to the issue of serialization of r_values
which conflict with the idea of tracking in a fundamental
way. If this were addressed one could just use

oa << transation(d1, d2, ..)

This would be pretty efficient in that all the class
information would be sent only once. Note
that MPI also has a special archive for this sort
of stuff you might want to check that out.

Robert Ramey


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk