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:目的是创建一个数据对象,使用该位置作为键,并标识该位置的所有记录。因此,该键不是一个字典的唯一键,而是一个字典列表的唯一键。有道理吗?