Simple key-only writes can definitely do it, but there's a few places where
you can introduce overhead:

- serialization
- network I/O
- indexes

My point wasn't necessarily that it wasn't possible. makePersistentAll does
use a batch write, and there are definitely sites that can do 12,000+ writes
a second (and well above that), but I don't know of any that will attempt to
do that in a single request. While it's an interesting thought exercise to
see if BigTable can do it through App Engine's interface (hint: it can,
globally, easily), I can't think of a single use case for a site to need to
do this all the time and with the sub-second requirement. I think it's
reasonable to ask why this design exists and why the requirements exist and
rethink one or the other.

On Wed, Feb 24, 2010 at 12:35 PM, Guillermo Schwarz <
guillermo.schw...@gmail.com> wrote:

> Ikai,
>
> Maybe you are right. Maybe not. I'm not an expert in datastore
> internals, but here is my point of view.
>
> This paper claims that Berkeley DB Java edition can insert about
> 15,000 records per second.
>
> http://www.oracle.com/database/docs/bdb-je-architecture-whitepaper.pdf
>
> The graphic is on page 22. The main reason they claim to be able to do
> that is that they don't need to actually sync the write to disk, they
> can queue the write, update in-memory data and write a log file.
> Writing the log file is for transactional purposes and it is the only
> write really needed.That is pretty fast.
>
> Cheers,
> Guillermo.
>
> On 24 feb, 16:51, "Ikai L (Google)" <ika...@google.com> wrote:
> > I also remember hearing (and this is not verified so don't quote me on
> this
> > or come after me if I'm wrong) from a friend of mine running KV stores in
> > production that there were issues with certain distributed key/value
> stores
> > that actually managed to slow down as a function of the number of objects
> in
> > the store - and Tokyo Tyrant was on his list. A key property of scalable
> > stores is that the opposite of this is true.
> >
> > 12,000 synchronous, serialized writes in a single sub-second request is
> > pretty serious. I am not aware of a single website in the world that does
> > this.
> >
> > On Wed, Feb 24, 2010 at 11:35 AM, Jeff Schnitzer <j...@infohazard.org
> >wrote:
> >
> >
> >
> > > I think this is actually an interesting question, and brings up a
> > > discussion worth having:
> >
> > > Is datastore performance reasonable?
> >
> > > I don't want to make this a discussion of reliability, which is a
> > > separate issue.  It just seems to me that the datastore is actually
> > > kinda pokey, taking seconds to write a few hundred entities.  When
> > > people benchmark Tokyo Tyrant, I hear numbers thrown around like
> > > 22,000 writes/second sustained across 1M records:
> >
> > >http://blog.hunch.se/2009/02/28-tokyo-cabinet
> >
> > > You might argue that the theoretical scalability of BigTable's
> > > distributed store is higher... but we're talking about two full orders
> > > of magnitude difference.  Will I ever near the 100-google-server
> > > equivalent load?  Could I pay for it if I did?  100 CPUs (measured)
> > > running for 1 month is about $7,200.  Actual CPU speed is at least
> > > twice the measured rate, so a single Tokyo Tyrant is theoretically
> > > equivalent to almost $15,000/month of appengine hosting.  Ouch.
> >
> > > Maybe this isn't an apples to apples comparison.  Sure, there aren't
> > > extra indexes on those Tyrant entities... but to be honest, few of my
> > > entities have extra indexes.  What other factors could change this
> > > analysis?
> >
> > > Thoughts?
> >
> > > BTW Tim, you may very well have quite a few indexes on your entities.
> > > In JDO, nearly all single fields are indexed by default.  You must
> > > explicitly add an annotation to your fields to make them unindexed.
> > > With Objectify, you can declare your entity as @Indexed or @Unindexed
> > > and then use the same annotation on individual fields to override the
> > > default.
> >
> > > Jeff
> >
> > > On Wed, Feb 24, 2010 at 12:43 AM, Tim Cooper <tco...@gmail.com> wrote:
> > > > I have been trying to write 12,000 objects in a single page request.
> > > > These objects are all very small and the total amount of memory is
> not
> > > > large.  There is no index on these objects - the only GQL queries I
> > > > make on them are based on the primary key.
> >
> > > > Ikai has said:  "That is - if you have to delete or create 150
> > > > persistent, indexed objects, you may want to rethink what problems
> you
> > > > are trying to solve."
> >
> > > > So I have been thinking about the problems I'm trying to solve,
> > > > including looking at the BuddyPoke blog and reading the GAE
> > > > documentation.  I'm trying to populate the database with entries
> > > > relating to high school timetables.
> >
> > > > * I could do the writes asynchronously, but that looks like a lot of
> > > > additional effort. On my C++ app, writing the same information to my
> > > > laptop drive, this happens in under a second, because the amount of
> > > > data is actually quite small, but it times out on GAE.
> > > > * I am using pm.makePersistentAll(), but this doesn't help.
> > > > * There is no index on the objects - I access them only through the
> > > > primary key.  (I'm pretty sure there's no index - but how can I
> > > > confirm this via the development server dashboard?)
> > > > * The objects constitute 12,000 entity groups.  I could merge them
> > > > into fewer entity groups, but there's no natural groupings I could
> > > > use, so it could get quite complex to introduce a contrived grouping,
> > > > and also this would complicate the multi-user updating of the
> objects.
> > > >  The AppEngine team seem to generally recommend using more entity
> > > > groups, but it's difficult to integrate that advice with the contrary
> > > > advice to use fewer entity groups for acceptable performance.
> > > > * I'd be happy if the GAE database was < 10 times slower than a
> > > > non-cloud RDBMS, but the way I'm using it, it's currently not.
> >
> > > > Does anyone have any advice?
> >
> > > > --
> > > > You received this message because you are subscribed to the Google
> Groups
> > > "Google App Engine for Java" group.
> > > > To post to this group, send email to
> > > google-appengine-j...@googlegroups.com.
> > > > To unsubscribe from this group, send email to
> > > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> <google-appengine-java%2bunsubscr...@googlegroups.com<google-appengine-java%252bunsubscr...@googlegroups.com>
> >
> > > .
> > > > For more options, visit this group at
> > >http://groups.google.com/group/google-appengine-java?hl=en.
> >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups
> > > "Google App Engine for Java" group.
> > > To post to this group, send email to
> > > google-appengine-j...@googlegroups.com.
> > > To unsubscribe from this group, send email to
> > > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> <google-appengine-java%2bunsubscr...@googlegroups.com<google-appengine-java%252bunsubscr...@googlegroups.com>
> >
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/google-appengine-java?hl=en.
> >
> > --
> > Ikai Lan
> > Developer Programs Engineer, Google App Enginehttp://
> googleappengine.blogspot.com|http://twitter.com/app_engine
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine for Java" group.
> To post to this group, send email to
> google-appengine-j...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=en.
>
>


-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
http://googleappengine.blogspot.com | http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to