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