2010-11-17 22 views
0

我有大量的順序整數我需要做一個查找,即我需要獲得一個串行整數ID的偏移量。問題是我寧願不將整個表加載到內存中,以便由於內存限制而構建散列表/字典,因此該怎麼辦?基於文件的查找表

可能工作的一個解決方案是將一個文件存儲在第一個存儲的整數是使用的最低ID,然後您爲每個ID編寫一個零整數數組,最大值(需要時附加)並寫入ID在正確的位置。例如,如果最低的ID是1000,並且您想要在20000處獲取偏移量,則只需檢索位置10000 + 20000-1處的整數。

使用內存映射這種技術應該表現很好。有沒有人有類似的問題,這是一個很好的解決方案,還是有更好的辦法?

+0

數據多久改變一次? – SLaks 2010-11-17 01:08:48

+0

編號將被連續添加到它後面(可能會有一些細微的差距),稍後可能會填充,但通常當設置了編號時,它會被設置爲 – Homde 2010-11-17 01:42:10

回答

0

您可以使用專爲在硬盤上使用而優化的B-Tree

B-樹被幾乎所有的現代數據庫和文件系統使用。

+0

啊有趣。如果在ID的B-Tree中存在很大的差距,那麼可能就不需要存儲過多的空鍵了,但是我沒有看到他們在這裏提供的優勢,因爲您必須進行搜索比直接查找 – Homde 2010-11-17 01:19:10

+0

@MattiasK:如果您經常更新數據,B-Tree會更好。如果你從不更新它,你的想法可能是最好的。 – SLaks 2010-11-17 01:22:51

+0

b樹不需要對任何單個項目進行完整掃描,而是通過O(log n)操作來遍歷中間節點以找到適當的葉節點。在大多數情況下,B樹搜索速度足夠快,因此您絕不需要全面掃描B樹的葉節點。你可以進一步優化你如何存儲數據並使用B +樹。 – 2010-11-20 13:23:44

0

你可以隨時去找一個數據庫。如果您不需要多個應用程序/進程訪問數據,則可以使用SQLite。這會自動爲您創建索引,並允許您使用SQL查詢來檢索信息。

+0

謝謝,我知道數據庫是什麼,不要讓nosql標籤欺騙你;) – Homde 2010-11-17 10:56:49

+0

我想你會:P。那麼出現的問題是:爲什麼這不符合你的需要?我建議這樣做的原因是它看起來像一個合適的解決方案,因爲它是一個B-Tree解決方案,可以爲您完成工作。 – 2010-11-17 13:35:53