Q: 請問有沒有一個 Python 腳本,每次執行時會將大量的整數 ID 儲存到存儲中,或者查詢某個 ID 是否存在於大量 ID 的存儲中? 可以推薦一個好的存儲方法嗎?先謝。
A: 對於處理大量整數 ID 的存儲和查詢,我可以推薦使用 Bloom Filter 結合 SQLite 數據庫的方法。這種方法既高效又節省空間。以下是一個實現這種方法的 Python 腳本:
import sqlite3 import mmh3 from bitarray import bitarray class IDStorage: def __init__(self, db_name='id_storage.db', filter_size=10000000, hash_count=7): self.conn = sqlite3.connect(db_name) self.cursor = self.conn.cursor() self.cursor.execute('''CREATE TABLE IF NOT EXISTS ids (id INTEGER PRIMARY KEY)''') self.bloom_filter = bitarray(filter_size) self.bloom_filter.setall(0) self.filter_size = filter_size self.hash_count = hash_count def add_id(self, id): # 添加到 Bloom Filter for seed in range(self.hash_count): result = mmh3.hash(str(id), seed) % self.filter_size self.bloom_filter[result] = 1 # 添加到 SQLite try: self.cursor.execute("INSERT INTO ids (id) VALUES (?)", (id,)) self.conn.commit() except sqlite3.IntegrityError: # ID 已存在,忽略 pass def check_id(self, id): # 首先檢查 Bloom Filter for seed in range(self.hash_count): result = mmh3.hash(str(id), seed) % self.filter_size if self.bloom_filter[result] == 0: return False # 如果 Bloom Filter 顯示可能存在,則檢查 SQLite self.cursor.execute("SELECT 1 FROM ids WHERE id=?", (id,)) return self.cursor.fetchone() is not None def close(self): self.conn.close() # 使用示例 storage = IDStorage() # 添加 ID for i in range(1000000): storage.add_id(i) # 檢查 ID print(storage.check_id(500000)) # 應該返回 True print(storage.check_id(1000001)) # 應該返回 False storage.close()
這個腳本的主要特點:
- Bloom Filter: 用於快速檢查 ID 是否可能存在。它可能有假陽性,但不會有假陰性。
- SQLite 數據庫: 用於實際存儲 ID,確保數據持久化和準確性。
- 高效查詢: 首先檢查 Bloom Filter,如果 Bloom Filter 顯示 ID 可能存在,才查詢 SQLite 數據庫。
- 空間效率: Bloom Filter 非常節省空間,可以處理大量 ID。
- 可擴展性: 可以根據需要調整 Bloom Filter 的大小和哈希函數的數量。
使用這個腳本,你可以高效地存儲和查詢大量的整數 ID。Bloom Filter 提供了快速的初步檢查,而 SQLite 數據庫確保了數據的持久性和準確性。這種方法在處理大量 ID 時既快速又節省內存。