2013-05-10 46 views
0

我有不同位置的数据按逗号分隔的文件中的日期和时间分隔。一种用于位置201682样本如下所示:从非常大的csv数据中有效创建词典字典

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 

的文件I具有数以百万计的数据线的运行。为了处理数据,我试图用Python创建一个字典对象。它本质上将该位置用作关键字,并将其余数据存储在列表中。这是在此我(徒劳的)尝试:

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

我得到的输出如下所示:

{'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']} 

意图是为字典中的每个记录存储Date,TimeData信息。然后将所有数据包含在列表中的特定位置。最后,创建一个以位置为关键字的列表字典。

我该如何获得代码来做到这一点?另外,有没有更有效的方法来做到这一点?我拥有的数据文件接近24GB大小。 [在Python中是否有多线程的map-reduce方法 - 我对map reduce范例非常新颖...]。非常感谢!

+3

我甚至不确定你的预期数据应该是什么。你有一个奇怪的混合字典和列表语法在那里是不合法的Python。 – mgilson 2013-05-10 00:16:59

+0

@mgilson:意图是创建一个数据对象,该数据对象使用该位置作为关键字并标识该位置的所有记录。所以这个关键字对于一个字典来说不是唯一的,而是一个字典列表。说得通? – sriramn 2013-05-10 00:25:50

回答

2

你描述的目标是结束一个数据结构。但是,大多数数据结构都是为了服务查询 - 你试图从这些信息中提取什么?在不知道的情况下,很难说什么效率最高,或者map-reduce是否有用。

这就是说,最简单的做法似乎是建立你所描述的字典来包含行标识而不是行数据本身。这肯定会节省一些空间,并且仍然允许你回答你的问题。但是,如果您的数据在磁盘上设置为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会让你想起来,特别是如果你要做很多即席查询。它可能支持更好的索引,而不是字典可以提供的,并且不受限于必须适应内存。