[Zope-dev] Re: [Interested?] New use for Zope+CMF+Archetypes -- startup time improvements

Paul Everitt paul at zope-europe.org
Sat May 14 04:43:11 EDT 2005


This is really interesting!  A year ago I put Python + Zope on a USB 
key, just for fun.  It would barely fit so I looked at zip techniques, 
and never could figure out how to get ZPTs etc. to load from a ZIP.

How did you do that part?

--Paul

Dieter Maurer wrote:
> Dear Zope developers,
> 
> we have used Zope+CMF+Archetypes in a new way -- not
> as a Web Application framework but as a framework for
> desktop applications that share a large part of their
> functionality with online applications (implemented with Zope+CMF+Archetypes).
> 
> A major stumbling block has been Zope's incredibly high startup
> time. We observerd times in the order of a minute on computers
> with either slow CPU or slow IO. This may be acceptable for
> a Web server but is prohibitive for a desktop application -- especially
> as the predecessor application started within a few seconds.
> 
> To overcome this obstacle, we tweaked Zope and fixed Python's import
> mechanism such that Zope now starts either out of a ZIP archive
> or as a frozen application. These measures had the following results.
> 
>   Startup times on a mid range computer (AMD Athon 1.4 GHz; 512 MB memory)
>   with a standard IDE disk.
> 
> 		    Cold start			    Warm start
> 		(after computer startup)	(most files in OS cache)
> 
>     File system	       13s			      5s
>     ZIP archive	        8s			      4s
>     Frozen		5s			      3s
> 
> 
> In more details, we did:
> 
>   *  implement a package for a new kind of "url"s "pypackage:"
>      for package relative access to resources.
> 
>      The package monkey patches Python's "open", "os.listdir",
>      "os.stat" to provide transparent access to
>      "pypackage:" identified resources.
> 
>      It currently support package relative access for
>      packages loaded from the file system, from a ZIP
>      archive and from the executable itself (i.e. frozen packages).
>      In the last case, the resources are in a separate ZIP
>      archive.
> 
>      This package might be interesting for Python as a whole
>      as it is not Zope specific.
> 
>   *  implement a shared object importer to be used
>      as a Python "meta_path" hook.
> 
>      This importer allows to load shared objects into the context
>      of a parent package (such as e.g. "ZODB.TimeStamp") although
>      the shared object is not located inside the package's source
>      (ZIP archive or executable).
> 
>   *  fix about 70 occurrences in Zope code where
>      package relative access was implemented by "dirname(__file__)"
>      to consistenty use "package_home".
> 
>   *  modify about a dozen places in Zope+CMF to use
>      "pypackage:" and cope with "__path__" not being a list
>      for frozen packages
> 
>   *  fix a few products (Archetypes and friends, TextIndexNG2,
>      PlacelessTranslationService, ...) to use
>      "package_home" (rather than "dirname(__file__)") and
>      not to change the current working directory (which obviously
>      would fail for destinationsbe in a ZIP archive
>      or the executable).
> 
>   *  implement lazy loading of "ImageFile"s to
>      reduce the risk of recursive imports (and reduce startup time).
> 
>   *  support lazy product initialization
> 
>   *  support configuration from a pickle file (to avoid
>      expensive parsing of the schema and configuration files).
> 
>      The pickle is used as a configuration cache.
> 
>   *  fixed Python's import mechanism not to treat ZIP
>      archives as a directory when the archive could not
>      find a module.
> 
> 
> If you were *really* interested in these startup time improvements,
> I could provide patches which might be integrated
> in the Zope core for e.g. Zope 2.9.
> 
> 



More information about the Zope-Dev mailing list