2011-11-09 65 views
0

我需要存儲短字符串(50個以上的字符),並快速查找它們。起初我想爲此使用SQLite。我使用一個索引的TEXT列創建了一個表。使用各種低級技巧,我可以在10秒內用100萬個字符串填充數據庫。鍵值數據庫

問題是如果PC重新啓動,添加額外的10.000行耗時30秒,這與10秒內的1M行無緣。原因是SQLite在添加新行之前必須從磁盤讀取現有索引的很大一部分。另一個問題是數據庫的大小增加了一倍,因爲所有的字符串由於b-tree機制而被存儲了兩次(一次在常規表中,一次在索引表中)。

有沒有簡單的選擇?例如,使用基於散列的查找?我瞭解各種NoSQL解決方案,但他們專注於分佈式和分佈式存儲,而我只需要一個簡單的嵌入式'平面文件'數據庫?

+0

我不明白它的指數?你是否使用與鍵和值相同的值? – jgauffin

+0

你需要指定你想要嵌入式數據庫的巫術語言/平臺。 – jgauffin

+0

如果您使用與索引和值相同的值,則索引完全無用。 – jgauffin

回答

0

將最新值保存到磁盤有多重要?

您可以使用內存集合(例如Dictionary或List),並在固定時間間隔內通過serializing it將其持久保存到本地文件的異步調用中。

然後,當您的應用程序啓動時,您可以將其反序列化回內存。

這將是一種更爲快速響應的方式來完成您所要做的事情,因爲您不必隨時通過讀/寫操作繼續刻錄磁盤。

+0

將數據插入到SQLite之前,數據已經存在於字典中,因此實現起來相當容易。但是將其反序列化回到內存中,仍然需要從磁盤讀取整個文件(如果我錯了,請糾正我)。它可能比SQLite更快,因爲它將是一個長序列讀取而不是許多小的隨機讀取。但它仍然不是我想要的:能夠在不讀取所有以前的記錄的情況下執行插入操作。 – Muis

+0

如何追加到純文本文件? –

+0

它會扭轉這個問題:使用文本文件我可以在不讀取以前的記錄的情況下進行插入,但要查找單個密鑰,我平均需要讀取50%的文件,因爲我無法翻譯散列/密鑰到該文件中的某個位置。我可以創建第二個文件,在那裏我將散列值映射到文件偏移量,但本質上我正在重新發明輪子:) – Muis