2015-08-18 52 views
2

我目前面臨的問題是不得不頻繁地訪問實時小型(700 Mhz)設備上的大型簡單數據集。該數據集包含從縮寫到縮寫詞的約400,000個映射,例如, 「frgm」到「片段」。使用該設備時,讀數會頻繁發生,並且不應超過15-20ms。使用Python實時訪問簡單但大型的數據集

我的第一次嘗試是要利用的SQLite在爲了創建僅包含單個表,其中兩個字符串構成的數據集的簡單數據的基礎上:

CREATE TABLE WordMappings (key text, word text) 

此表創建一次,雖然改變是可能,只有讀取訪問時間至關重要。

this guide,我的SELECT語句如下所示:

def databaseQuery(self, query_string): 
    self.cursor.execute("SELECT word FROM WordMappings WHERE key=" + query_string + " LIMIT 1;") 
    result = self.cursor.fetchone() 

    return result[0] 

然而,在使用上擁有20000名縮寫測試數據的基礎這段代碼,我無法獲取比更快的數據〜60ms的,這是遠慢。

有關如何使用SQLite提高性能或者採用其他方法會產生更有希望的結果的任何建議?

+0

你有足夠的內存來保存所有數據嗎?如果是這樣,請將其加載到字典中... – barny

回答

2

您可以通過它創建索引加快對key列查找:

CREATE INDEX kex_index ON WordMappings(key); 

要檢查查詢是否使用索引或掃描整個表,使用EXPLAIN QUERY PLAN

1

很久以前,我嘗試使用SQLite進行順序數據處理,但速度不夠快,無法滿足我的需求。當時,我正在將它與現有的內部二進制格式進行比較,我最終使用該格式。

我沒有親自使用過,但朋友使用PyTables來處理大的時間序列數據;也許值得一看。

0

事實證明,定義一個主鍵可將單個查詢加速一個因子數量級。

具有400,000個隨機創建的條目(10/20個字符長)的測試表上的單獨查詢不超過5ms,滿足要求。

該表現在創建如下:

CREATE TABLE WordMappings (key text PRIMARY KEY, word text) 

主鍵的使用,因爲

  • 它是隱式地唯一的,這是存儲在縮寫的屬性
  • 它不能是NULL,所以包含它的行不能爲NULL。在我們的例子中,如果他們是,該數據庫將被破壞

其他用戶已經使用索引建議,但是,它們不一定是唯一的,並根據the accept answer to this question,他們不必要的減慢更新/插入/刪除的性能。儘管如此,使用索引也可以提高性能。儘管原始作者未經測試,但尚未經原作者測試。