$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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