Python:大量的dict就像对象内存一样使用

时间:2011-12-07 06:51:48

标签: python memory dictionary

我正在使用csv.DictReader将一些大文件读入内存然后进行一些分析,因此来自多个CSV文件的所有对象都需要保存在内存中。我需要将它们作为字典阅读以使分析更容易,并且因为可以通过添加新列来更改CSV文件。

是的,可以使用SQL,但如果不需要,我宁愿避免使用它。

我想知道是否有更好更简单的方法。我担心的是,我会有许多具有相同键和浪费内存的字典对象?使用__slots__是一个选项,但我只会在读取CSV后知道对象的属性。

[编辑:]由于使用遗留系统和“限制”,因此无法使用第三方库。

5 个答案:

答案 0 :(得分:2)

如果您使用的是Python 2.6或更高版本,collections.namedtuple就是您所要求的。

参见http://docs.python.org/library/collections.html#collections.namedtuple (甚至有一个与csv一起使用的例子)。

编辑:它要求字段名称作为Python标识符有效,所以它可能不适合你的情况。

答案 1 :(得分:1)

您是否考虑过使用pandas

它对表非常有用。与您相关的是read_csv函数和dataframe类型。

这就是你如何使用它:

>>> import pandas
>>> table = pandas.read_csv('a.csv')
>>> table
   a  b  c   
0  1  2  a   
1  2  4  b   
2  5  6  word
>>> table.a
0    1
1    2
2    5
Name: a

答案 2 :(得分:0)

使用python shelve。它是一个类似于对象的字典,但可以在需要时转储到磁盘上,并且很容易加载回来。

答案 3 :(得分:0)

如果一列中的所有数据都是同一类型,则可以使用NumPy。 NumPy的loadtxt和genfromtxt函数可用于读取csv文件。因为它返回一个数组,所以内存使用量小于dict。

答案 4 :(得分:0)

的可能性:

(1)对csv.DictReader方法进行基准测试,看它是否会导致问题。请注意,dicts包含键和值的POINTERS;实际的键字符串不会复制到每个字典中。

(2)对于每个文件,使用csv.Reader,在第一行之后,动态构建一个类,每个剩余行实例化一次。也许这就是你的想法。

(3)有一个固定类,每个文件实例化一次,它为您提供实际数据的元组列表,将列索引映射到列名称的元组,以及将列名称映射到列索引的字典。元组占用的内存少于列表,因为没有分配额外的附加空间。然后,您可以通过(row_index,column_index)和(row_index,column_name)获取和设置数据。

在任何情况下,为了获得更好的建议,如何处理一些简单的事实和统计数据:什么版本的Python?多少个文件?每个文件的行数?每个文件的列?总唯一键/列名?