2012-10-13 30 views
2

假設我們有一個包含Employee name和Age列的csv文件(> 5GB)。該文件按年齡排序。 現在,我希望用戶使用Age搜索此文件。有人能指導我哪個數據結構最適合這個需求嗎?用於存儲巨大(> 5GB)排序文件的數據結構

myfile.csv

25 ABC  
25 MNP 
14 XYZ 
14 PQR 

輸入

14 

輸出

XYZ 
PQR 
+5

我會餵它到數據庫和搜索,或至少按年齡排序。 –

+0

@waleed Khan:是的,文件使用年齡值排序。 – SRC

+0

爲什麼不把它分解成單獨的文件? –

回答

4

假設文件太大而無法放入RAM中,您可以創建一個索引,這樣可以最大限度地減少磁盤讀取次數(RAM讀取速度要慢得多)。

一些常用的磁盤索引是B+ trees(其中頂級存儲在RAM中)和hash tables

或者,您可以將其存儲爲SQL表,並讓圖書館自行處理。

另一種選擇,因爲範圍相當小(我不能想象一個時代是大於200),你可以使用200(或可能更少)不同的文件:names_1,names_2,...,names_200其中names_i擁有所有這些人的年齡都在名稱列表i
(此外,由於年齡在許多entriesthis方式ommitted,你也許可以在RAM中,以實際符合它作爲一個dictionary:age->list<names>

如果數據符合RAM - 您可以使用一個排序的數組(若發生在數據不經常/不是預期的)並使用二進制搜索。
如果你需要數據的變化,你可以使用一些其他的結構,如在RAM中的哈希表,或self balancing BST

+2

當答案涉及B樹時,請使用數據庫:) –

+0

@AlexandreC:除非是面試/硬件,並且您應該知道如何實施它。無論如何,我建議使用SQL(或其他數據庫系統)來存儲數據,如果它是用於真實生活的項目。 – amit

1

,如果你的基礎架構允許在內存中的解決方案您還沒有表示。如果是這樣,看到你用python標記了你的問題,我會把文件的內容讀入defaultdict。如果表現尚可,你有一個快速的基於標準庫的解決方案

>>> from collections import defaultdict 
>>> z = defaultdict(list) 
>>> z[25].append("ABC") 
>>> z[25].append("MNP") 
>>> print z[25] 
['ABC', 'MNP'] 
+0

:謝謝你的回答。 – SRC