假設我們有一個包含Employee name和Age列的csv文件(> 5GB)。該文件按年齡排序。 現在,我希望用戶使用Age搜索此文件。有人能指導我哪個數據結構最適合這個需求嗎?用於存儲巨大(> 5GB)排序文件的數據結構
例:
myfile.csv
25 ABC
25 MNP
14 XYZ
14 PQR
輸入:
14
輸出:
XYZ
PQR
假設我們有一個包含Employee name和Age列的csv文件(> 5GB)。該文件按年齡排序。 現在,我希望用戶使用Age搜索此文件。有人能指導我哪個數據結構最適合這個需求嗎?用於存儲巨大(> 5GB)排序文件的數據結構
例:
myfile.csv
25 ABC
25 MNP
14 XYZ
14 PQR
輸入:
14
輸出:
XYZ
PQR
假設文件太大而無法放入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
當答案涉及B樹時,請使用數據庫:) –
@AlexandreC:除非是面試/硬件,並且您應該知道如何實施它。無論如何,我建議使用SQL(或其他數據庫系統)來存儲數據,如果它是用於真實生活的項目。 – amit
,如果你的基礎架構允許在內存中的解決方案您還沒有表示。如果是這樣,看到你用python標記了你的問題,我會把文件的內容讀入defaultdict。如果表現尚可,你有一個快速的基於標準庫的解決方案
>>> from collections import defaultdict
>>> z = defaultdict(list)
>>> z[25].append("ABC")
>>> z[25].append("MNP")
>>> print z[25]
['ABC', 'MNP']
:謝謝你的回答。 – SRC
我會餵它到數據庫和搜索,或至少按年齡排序。 –
@waleed Khan:是的,文件使用年齡值排序。 – SRC
爲什麼不把它分解成單獨的文件? –