Re: Peak memory usage for Cayenne

From: Øyvind Harboe (oyvind.harbo..ylin.com)
Date: Fri Jun 20 2008 - 04:31:24 EDT

  • Next message: Andrus Adamchik: "Re: Peak memory usage for Cayenne"

    On Fri, Jun 20, 2008 at 10:22 AM, Andrus Adamchik
    <andru..bjectstyle.org> wrote:
    >
    >
    >
    > On Jun 20, 2008, at 10:45 AM, Øyvind Harboe wrote:
    >
    >> 1. Consider the code below. Will all the objects from the query
    >> be locked in memory?
    >>
    >> query=new SelectQuery(Foo.class);
    >> query.setPageSize(1000); /* does this matter? */
    >> /* Does performQuery return a clever implementation of
    >> a List that does not lock the CayenneDataObjects into memory?
    >> */
    >> l=context.performQuery(query);
    >> while (i.hasNext())
    >> {
    >> Foo f=(Foo) i.next();
    >>
    >> .... do some processing here that ...
    >>
    >>
    >> }
    >>
    >> 2. When does peak memory usage occur above?
    >
    > At the end of the the iterator when all pages are resolved.

    Ah! Thanks! I'll have to change the places in the code that
    does this for *large* lists then.

    >
    >> 3. Can a CayenneDataObject be garbage collected as long as it's
    >> DataContext is in scope?
    >>
    >> I'm wondering because as far as I have understood the two if
    >> statements below are equivalent when a & b are CayenneDataObjects
    >> in the same DataContext.
    >
    > It is stored using a weak reference, so yes, it can be garbage collected if
    > there are no other references to the object in the code.
    >
    >> That is if 'a' can be garbage collected during the lifetime of the
    >> DataContext, then 'a' is points to different objects during the
    >> lifetime of CayenneDataObject's and a==b just 'barely' works.
    >
    > Not "barely". It always works. If you have var "a" pointing to a given
    > object, that fact alone will prevent garbage collection within the scope of
    > "a" definition.

    a==b vs. q.getObjectId().equals(b.getObjectId()) was a bit of a
    non-sequitor, I'll post
    a seperate message.

    >> 4. Should I consider some "clever" implementation of a query that
    >> ensures that only a small amount of CayenneDataObject's are
    >> locked in memory at the time?
    >>
    >> Some ideas:
    >>
    >> - use performIteratedQuery() w/setPageSize()
    >> - ResultIterator.nextDataRow() is a bit strange: it returns a Map<>, but
    >> perhaps I can safely upcast that.
    >> - use objectFromdataRow()
    >
    >
    > Yes, use 'performIteratedQuery' - it was designed for serial processing of
    > arbitrary size lists.

    I want to have a stab at creating a patch that has weak references for paged
    queries... it has less impact on the application code.

    -- 
    Øyvind Harboe
    http://www.zylin.com/zy1000.html
    ARM7 ARM9 XScale Cortex
    JTAG debugger and flash programmer
    



    This archive was generated by hypermail 2.0.0 : Fri Jun 20 2008 - 04:32:16 EDT