我們偵測到您正在使用Ad Block插件來阻止廣告顯示

It looks like you're using an ad-blocker!

您好!我們偵測到您正在使用Ad Block插件來阻止廣告顯示,你知道嗎?我們是沒有收取讀者的任何費用,而我們的主要收有入來源是廣告費,所以如果沒有資金維持成本,我們網站是很難經營下去。 請停用這些廣告攔截器來支持我們「灣仔298電腦資訊網」「www.wanchai298.com」,讓我們的廣告可以顯示。謝謝您的理解。

298討論區

請問有沒有一個 Python 腳本,每...
 
Notifications
Clear all

請問有沒有一個 Python 腳本,每次執行時會將大量的整數 ID 儲存到存儲中,或者查詢某個 ID 是否存在於大量 ID 的存儲中? 請推薦一個好的存儲方法

1 Posts
1 Users
0 Likes
121 Views
298站長
(@infowanchai298-com)
Posts: 4048
Illustrious Member Admin
Topic starter
 

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()

 

 

這個腳本的主要特點:

  1. Bloom Filter: 用於快速檢查 ID 是否可能存在。它可能有假陽性,但不會有假陰性。
  2.  
  3. SQLite 數據庫: 用於實際存儲 ID,確保數據持久化和準確性。
  4. 高效查詢: 首先檢查 Bloom Filter,如果 Bloom Filter 顯示 ID 可能存在,才查詢 SQLite 數據庫。
  5. 空間效率: Bloom Filter 非常節省空間,可以處理大量 ID。
  6. 可擴展性: 可以根據需要調整 Bloom Filter 的大小和哈希函數的數量。

使用這個腳本,你可以高效地存儲和查詢大量的整數 ID。Bloom Filter 提供了快速的初步檢查,而 SQLite 數據庫確保了數據的持久性和準確性。這種方法在處理大量 ID 時既快速又節省內存。

 
Posted : 13/07/2024 3:44 下午
Share: