2013-05-10 47 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會讓你想起來,特別是如果你要做很多即席查詢。它可能支持更好的索引,而不是字典可以提供的,並且不受限於必須適應內存。