使用DictReader节省内存开销

时间:2013-05-27 09:12:48

标签: python

我使用csv.DictReader从CSV文件中读取数据。当迭代读取器时,它会产生字典,其中包含从CSV标头获取的键和每行的值:

with open(filename) as h:
    data = csv.DictReader(h)
    for row in data:
        # row is dict

每一行都是keys的字典,每行的键完全相同。如果值是整数并且键(字符串)很长,则键占用的内存空间比值大..

我可以按照每行键指向相同实例键的方式迭代行,这样每行节省一些内存空间吗?

请注意,我事先并不知道密钥 - 它们来自CSV标头。否则,我可以使用namedtuple__slots__

1 个答案:

答案 0 :(得分:2)

可以使用namedtuple;自己从第一行构建它:

with open(filename, 'rb') as h:
    data = csv.reader(h)
    headers = next(data)
    RowTuple = namedtuple('RowTuple', headers)
    for row in data:
        row = RowTuple(row)

这基本上是DictReader()的作用;从第一行拿出钥匙。

请注意,DictReader()代码会使用dict(zip(self.fieldnames, row))创建字典;这个为每一行重用相同的字符串,你唯一的内存开销是dict表本身加上键的哈希值(每次都重新计算并缓存)。不会为每一行重新创建键的字符串。 namedtuple方法也没有,但自从__slots__使用以来不需要保留哈希值。