簡體   English   中英

使用Python實時訪問簡單但龐大的數據集

[英]Real-time access to simple but large data set with Python

我目前面臨的問題是,必須經常實時訪問較小(700 Mhz)設備上的大型但簡單的數據集。 數據集包含從縮寫到縮寫詞(例如,“ frgm”到“ fragment”)的大約40萬個映射。 使用設備時,讀取會經常發生,並且讀取時間不應超過15-20ms。

我的第一個嘗試是利用SQLite創建一個簡單的數據庫,該數據庫僅包含一個表,其中兩個字符串構成一個數據集:

CREATE TABLE WordMappings (key text, word text)

該表只創建一次,盡管可以進行更改,但只有讀訪問權限對時間很重要。

按照本指南 ,我的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]

但是,在具有20,000個縮寫的測試數據庫上使用此代碼,我無法以比〜60ms更快的速度獲取數據,這太慢了。

關於如何使用SQLite改善性能的任何建議,或者其他方法會產生更可喜的結果嗎?

您可以通過為其創建索引來加快對key列的查找:

CREATE INDEX kex_index ON WordMappings(key);

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

很久以前,我嘗試使用SQLite來存儲順序數據,但是它的速度不足以滿足我的需求。 當時,我將其與現有的內部二進制格式進行了比較,最終我使用了這種格式。

我還沒有親自使用過,但是朋友使用PyTables來處理大型時間序列數據; 也許值得研究。

事實證明,定義主鍵將單個查詢的速度提高了一個數量級。

在具有40萬個隨機創建的條目(長10/20個字符)的測試表上的單個查詢所用的時間不超過5毫秒,這可以滿足要求。

現在,表創建如下:

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

使用主鍵是因為

  • 它是隱式唯一的,是所存儲縮寫的一個屬性
  • 它不能為NULL,因此包含它的行不能為NULL。 在我們的情況下,如果是這樣,數據庫將損壞

其他用戶建議使用索引,但是,它們不一定是唯一的,並且根據對此問題的接受答案 ,它們不必要地減慢了更新/插入/刪除性能。 但是,使用索引也可以提高性能。 盡管未經原始作者測試,但這未經原始作者測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM