phoebe> import math
phoebe> import time
phoebe> class textfile:
phoebe> def __init__(self,fname):
phoebe> self.name=fname
phoebe> self.fh=open(fname)
phoebe> self.fh.readline()
phoebe> self.lines=self.fh.readlines()
Don't do that. The problem is that you are trying to read the entire file
into memory. Learn to operate a line (or a few lines) at a time. Try
something like:
a = open("/home/sservice/nfbc/GenoData/CompareCalls3.diff")
for line in a:
do your per-line work here
--
Skip Montanaro - sk...@pobox.com - http://www.smontanaro.net/
when i wake up with a heart rate below 40, i head right for the espresso
machine. -- chaos @ forums.usms.org
Anyway, loading the whole file into a list is seldom the best answer,
except for files under a meg or so. It's usually better to process the
file in sequence. It looks like you're also making slices of that data,
so they could potentially be pretty big as well.
If you can be assured that you only need the current line and the
previous two (for example), then you can use a list of just those three,
and delete the oldest one, and add a new one to that list each time
through the loop.
Or, you can add some methods to that 'textfile' class that fetch a line
by index. Brute force, you could pre-scan the file, and record all the
file offsets for the lines you find, rather than storing the actual
line. So you still have just as big a list, but it's a list of
integers. Then when somebody calls your method, he passes an integer,
and you return the particular line. A little caching for performance,
and you're good to go.
Anyway, if you organize it that way, you can code the rest of the module
to not care whether the whole file is really in memory or not.
BTW, you should derive all your classes from something. If nothing
else, use object.
class textfile(object):
Just out of curiousity... why is that? I've been coding in Python for
a long time, and I never derive my base classes. What's the advantage
to deriving them?
class Foo:
uses the old object model.
class Foo(object):
uses the new object model.
See http://docs.python.org/reference/datamodel.html (specifically
section 3.3) for details of the differences.
Vil.
Note that Python 3.0 makes explicitly subclassing `object` unnecessary
since it removes old-style classes; a class that doesn't explicitly
subclass anything will implicitly subclass `object`.
Cheers,
Chris
--
http://blog.rebertia.com
"Old style" classes (those whose base classes aren't derived from
anything) have a few disadvantages:
(1) Properties don't work correctly:
>>> class Parrot: # old-style class
... def __init__(self):
... self._x = 3
... def _setter(self, value):
... self._x = value
... def _getter(self):
... print "Processing ..."
... return self._x + 1
... x = property(_getter, _setter)
...
>>> p = Parrot()
>>> p.x
Processing ...
4
>>> p.x = 2
>>> p.x
2
In general, anything that uses the descriptor protocol, not just
property, will fail to work correctly with old-style classes.
(2) Classes using multiple inheritance with diamond-shaped inheritance
will be broken.
(3) __slots__ is just an attribute.
(4) super() doesn't work.
And, depending on whether you consider this a disadvantage or an
advantage:
(5) Special methods like __len__ can be over-ridden on the instance, not
just the class:
>>> class K:
... def __len__(self):
... return 0
...
>>> k = K()
>>> len(k)
0
>>> k.__len__ = lambda : 42
>>> len(k)
42
In their favour:
(1) Less typing.
(2) If you're not using descriptors, including property(), or multiple
inheritance with diamond diagrams, they work fine.
(3) They're (apparently) a tiny bit faster.
--
Steven