Bazaar: Out of memory

James Henstridge james at jamesh.id.au
Sat May 10 01:59:42 BST 2008


2008/5/10 Andrew Bennetts <andrew at canonical.com>:
> James Henstridge wrote:
>  [...]
>
> >
>  > In contrast, each "line_bytes += line" iteration in your version does:
>  >  1. allocate a new string large of length len(line_bytes) + len(line)
>  >  2. copy line_bytes and line into the new string
>  >  3. free the old line_bytes.
>
>  (Actually, since Python 2.4, "s += 'abc'" is sometimes more efficient:
>  http://python.org/doc/2.4.2/whatsnew/node12.html#SECTION0001210000000000000000
>
>  It doesn't sound like you should rely on that particular optimisation though.)
>
>  I haven't looked at the offending code at all, but how hard would it be for the
>  relevant APIs to accept an iterable of strings instead of a single big string?

Looking at the optimisation in ceval.c, it seems you'll still suffer a
realloc() of the original string (which will be an allocation +
memcpy() on some iterations), and a memcpy() of the other argument.
So it could be a bit faster than what I described, but would still
give quadratic behaviour (albeit slightly better quadratic behaviour).

James.



More information about the bazaar mailing list