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

我为数百万行数据运行的文件。为了处理数据,我试图在 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']}

目的是在字典中存储每条记录DateTimeData信息。然后将列表中特定位置的所有数据集中在一起。最后,创建以位置为键的此类列表的字典。

我怎样才能得到代码来做到这一点?另外,有没有更有效的方法来做到这一点?我拥有的数据文件大小接近 24GB。[在 Python 中是否有用于多线程的 map-reduce 方法 - 我对 map reduce 范式非常陌生......]。非常感谢帮助!

4

1 回答 1

2

您描述的目标是最终得到一个数据结构。但是,大多数数据结构都旨在为查询提供服务——您究竟想从这些信息中提取什么?在不知道这一点的情况下,很难说什么是最有效的,或者 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,尤其是当您要进行大量即席查询时。它可能支持比字典提供的更好的索引,并且不受必须放入内存的限制。

于 2013-05-10T01:24:43.863 回答