2013-05-27 35 views
1

我使用csv.DictReader從CSV文件讀取數據。當該閱讀器遍歷,它產生與來自CSV標題取出鍵詞典和的值每行:使用DictReader節省內存開銷

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

每一行是與keys一個字典,並且每行具有完全相同的鍵。如果這些值是整數並且鍵(字符串)很長,那麼這些鍵佔用的內存空間會大於這些值。

是否可以按照每行的鍵指向相同的方式迭代行實例的鍵,所以我節省了每行的內存空間?

請注意,我不提前知道密鑰 - 它們取自CSV標頭。否則,我可以使用namedtuple__slots__

回答

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__,所以不需要保留哈希值。