Python 从非常大的csv数据高效地创建字典字典

Python 从非常大的csv数据高效地创建字典字典,python,dictionary,mapreduce,Python,Dictionary,Mapreduce,我在一个逗号分隔的文件中按日期和时间分割了不同位置的数据。位置201682的示例如下所示: Location Date Time Data 201682 3/15/2011 1:00:00 AM 10 201682 3/16/2011 1:00:00 AM 12 201682 3/15/2011 2:00:00 AM 32 201682 3/16/2011 2:00:0

我在一个逗号分隔的文件中按日期和时间分割了不同位置的数据。位置
201682
的示例如下所示:

Location    Date        Time            Data
201682      3/15/2011   1:00:00 AM      10
201682      3/16/2011   1:00:00 AM      12
201682      3/15/2011   2:00:00 AM      32
201682      3/16/2011   2:00:00 AM      31
201682      3/15/2011   3:00:00 AM      21
201682      3/16/2011   3:00:00 AM      20
201682      3/15/2011   4:00:00 AM      45
201682      3/16/2011   4:00:00 AM      56
201682      3/15/2011   5:00:00 AM      211
201682      3/16/2011   5:00:00 AM      198
201682      3/15/2011   6:00:00 AM      512
201682      3/16/2011   6:00:00 AM      324
{'Date':'3/16/2011', 'Time':'6:00:00 AM', 'Data':'324'}
我的文件运行了数百万行数据。为了处理数据,我试图用Python创建一个dictionary对象。它基本上将该位置用作键,并将其余数据存储在列表中。这是我(徒劳的)尝试:

import csv

headers = None
records = {}

reader=csv.reader(open(csvFile))
for row in reader:
    if reader.line_num == 1:
        headers = row[1:]
    else:
        records[row[0]] = dict(zip(headers, row[1:]))

print records['201682']
我得到的输出如下所示:

Location    Date        Time            Data
201682      3/15/2011   1:00:00 AM      10
201682      3/16/2011   1:00:00 AM      12
201682      3/15/2011   2:00:00 AM      32
201682      3/16/2011   2:00:00 AM      31
201682      3/15/2011   3:00:00 AM      21
201682      3/16/2011   3:00:00 AM      20
201682      3/15/2011   4:00:00 AM      45
201682      3/16/2011   4:00:00 AM      56
201682      3/15/2011   5:00:00 AM      211
201682      3/16/2011   5:00:00 AM      198
201682      3/15/2011   6:00:00 AM      512
201682      3/16/2011   6:00:00 AM      324
{'Date':'3/16/2011', 'Time':'6:00:00 AM', 'Data':'324'}
我希望数据看起来是这样的:

{['Date':'3/15/2011', 'Time':'1:00:00 AM', 'Data':'10'],
 ['Date':'3/16/2011', 'Time':'1:00:00 AM', 'Data':'12'],
 ['Date':'3/15/2011', 'Time':'2:00:00 AM', 'Data':'32'],
 ['Date':'3/16/2011', 'Time':'2:00:00 AM', 'Data':'31'],
 ['Date':'3/15/2011', 'Time':'3:00:00 AM', 'Data':'21'],
 ['Date':'3/16/2011', 'Time':'3:00:00 AM', 'Data':'20'],
 ['Date':'3/15/2011', 'Time':'4:00:00 AM', 'Data':'45'],
 ['Date':'3/16/2011', 'Time':'4:00:00 AM', 'Data':'56'],
 ['Date':'3/15/2011', 'Time':'5:00:00 AM', 'Data':'211'],
 ['Date':'3/16/2011', 'Time':'5:00:00 AM', 'Data':'198'],
 ['Date':'3/15/2011', 'Time':'6:00:00 AM', 'Data':'512'],
 ['Date':'3/16/2011', 'Time':'6:00:00 AM', 'Data':'324']}
其目的是存储字典中每个记录的
日期
时间
数据
信息。然后将列表中某个特定位置的所有数据合并到一起。最后,创建一个以位置为键的列表字典


我如何获取代码来执行此操作?还有,有没有更有效的方法?我拥有的数据文件大小接近24GB。[Python中是否有针对多线程的map reduce方法-我对map reduce范例非常陌生…]。非常感谢您的帮助

您描述的目标是以数据结构结束。然而,大多数数据结构都是为查询服务的——您到底想从这些信息中提取什么?如果不知道这一点,就很难说什么是最有效的,或者map reduce是否有用

这就是说,似乎最简单的方法是构建您描述的字典,使其包含行ID,而不是行数据本身。这肯定会节省一些空间,并且仍然允许您回答您的查询。然而,如果您的数据集在磁盘上为24GB,那么您需要更多的数据才能将其保存在RAM中。假设给定一个查询,获取行ID就足够了,那么我建议:

import csv

headers = None
records = {}

reader = csv.reader(open(csvFile))

# So we can have lists as entries by default
from collections import defaultdict
index = {}

for row in reader:
    if reader.line_num == 1:
        headers = row
        # We'll set up rows to be a dictionary with one defaultdict
        # for each of the headers, mapping the unique values to the
        # rows that match
        index = dict((header, defaultdict(list)) for header in headers)
    else:
        for header, value in zip(headers, row):
            index[header][value].append(reader.line_num)

# Now, you can find out which rows have, say, 'Location' set to a given value
index['Location']['201682']

# Or all the rows with 'Time' set to '1:00:00 AM'
index['Time']['1:00:00 AM']

这就是说,这只是使用python字典来建立索引,有一些工具更适合于此。一下子,我就想到了mySQL,特别是当你要做很多临时查询的时候。它可能支持比字典更好的索引功能,并且不受必须放入内存的限制。

我甚至不确定您想要的数据应该是什么。这里有一个奇怪的混合字典和列表语法,它不是有效的python。@mgilson:目的是创建一个数据对象,使用该位置作为键,并标识该位置的所有记录。因此,该键不是一个字典的唯一键,而是一个字典列表的唯一键。有道理吗?