Python:大量类似dict的对象使用内存

Python:大量类似dict的对象使用内存,python,memory,dictionary,Python,Memory,Dictionary,我正在使用csv.DictReader将一些大文件读入内存,然后进行一些分析,因此来自多个csv文件的所有对象都需要保存在内存中。我需要将它们作为字典来阅读,以便更容易地进行分析,因为CSV文件可能会通过添加新列进行更改 是的,可以使用SQL,但如果不需要,我宁愿避免使用它 我想知道是否有更好更简单的方法来做到这一点。我担心的是,我会有许多具有相同键的dictionary对象,这会浪费内存吗?可以选择使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,但我只有在读取C

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

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

我想知道是否有更好更简单的方法来做到这一点。我担心的是,我会有许多具有相同键的dictionary对象,这会浪费内存吗?可以选择使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但我只有在读取CSV后才能知道对象的属性


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

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

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

您考虑过使用它吗

这对桌子很有用。与您相关的是功能和类型

以下是您将如何使用它:

>>> 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

如果您使用的是Python2.6或更高版本,
collections.namedtuple
就是您想要的

看 (甚至有一个将其与csv一起使用的示例)

编辑:它要求字段名作为Python标识符有效,因此可能不适合您的情况。

可能性:

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

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

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


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

我最近一直在与pandas合作。对于这类问题,它是一个很好的工具包。看起来不错,但无法使用第三方LIB。我的用法是每行都是一个实体。谢谢你的提醒,但不能使用libs:(我编辑了我的问题。我认为这与本例无关。在2.7中:如果重命名为true,无效的字段名将自动替换为位置名。例如,['abc','def','ghi','abc']转换为['abc','U 1','ghi','U 3'],从而消除关键字def和重复的字段名abc。)。