> I'm not sure why you're getting the MemoryError, but it'd be easier to
> figure out if you posted the entire text of the traceback.


Traceback: <usual bit about in module..>

Line 39: seg=codeSt[element:endInd+len(endStr]
MemoryError

Hehe. Helpful, no?

I think I'll sprinkle print statements throughout as suggested, and
wrap it in a function for that optimization Jeff mentioned.

Thanks for the advice, I'll let you know how it goes.


Regards,

Liam Clarke

I didn't think to 
On Wed, 08 Dec 2004 12:29:10 -0800, Jeff Shannon <[EMAIL PROTECTED]> wrote:
> Liam Clarke wrote:
> 
> > Hi all,
> >
> > I'm playing with a file, and attempting to replace a section with a
> > string, and using the following command -
> >
> > seg=codeSt[element:endInd+len(endStr]
> > codeSt=codeSt.replace(seg, hrefString)
> >
> > At the replace, I get a MemoryError. It's part of a for loop, but it
> > gives the error the first time around.
> 
> 
> I'm not sure why you're getting the MemoryError, but it'd be easier to
> figure out if you posted the entire text of the traceback.
> 
> A few other pointers --
> 
> You'll probably get better performance if you put all of this code
> inside of a function.  Even if you're only running it once, putting it
> in a function allows the interpreter to do some optimization tricks on
> locals() which can't be done at the module-global level (where you're
> running now).  It's just barely possible that just doing this will
> help with your MemoryError problem.  (You would probably benefit from
> splitting it into multiple functions, actually.  I'd have the code
> that finds text and url values each in their own function, for example.)
> 
> Try adding a line in between those two that prints out the value of
> element and endInd, and then check that those numbers really are valid
> indexes into codeSt.  While you're at it, print out hrefString and
> make sure it looks like it's supposed to.
> 
> At the start of your program, you have the following:
> 
>      inp=file("toolkit.txt","r")
>      codeSt=inp.readlines()
>      inp.close()
>      codeSt="".join(codeSt)
> 
> Since you're not processing by lines, and are explicitly joining all
> the lines together, why have Python separate them for you?  It would
> be much more efficient to simply use 'codeSt = inp.read()', with no
> need to join() afterwards.  The readlines() method effectively does a
> read() followed by splitting the result into lines; for your purposes,
> there's no point in splitting the lines if you're just going to join()
> them immediately.
> 
> Instead of finding the start and end index of the segment you want to
> replace, making a copy of that segment, and then scanning your
> original string to replace that segment with a new chunk, it would
> probably make more sense to simply grab codeSt before the segment and
> after the segment and concatenate them with the new chunk.  Thus, your
> two lines above become
> 
>      codeSt = codeSt[:element] + hrefString \
>                       + codeSt[endInd+len(endStr)]
> 
> Once again, this would avoid doing the same work twice.
> 
> > Now, I had imagined that codeSt=codeSt+10 would destroy the old codeSt
> > in memory and create a new codeSt. Am I right?
> 
> Actually, this will probably raise a TypeError (cannot concatenate
> 'str' and 'int' objects).  ;)  But yes, rebinding codeSt to a new
> string should allow the old string to be destroyed (if there are no
> other references to it).
> 
> Hope that this helps.
> 
> Jeff Shannon
> Technician/Programmer
> Credit International
> 
> 
> 
> 
> _______________________________________________
> Tutor maillist  -  [EMAIL PROTECTED]
> http://mail.python.org/mailman/listinfo/tutor
> 


-- 
'There is only one basic human right, and that is to do as you damn well please.
And with it comes the only basic human duty, to take the consequences.
_______________________________________________
Tutor maillist  -  [EMAIL PROTECTED]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to