【Python爬蟲(25)】解鎖Python爬蟲:數據存儲的最優選擇與高效策略

【Python爬蟲】專欄簡介:本專欄是 Python 爬蟲領域的集大成之作,共 100 章節。從 Python 基礎語法、爬蟲入門知識講起,深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐,覆蓋網頁、圖片、音頻等各類數據爬取,還涉及數據處理與分析。無論是新手小白還是進階開發者,都能從中汲取知識,助力掌握爬蟲核心技能,開拓技術視野。

目錄

  • 一、根據數據特點選擇合適的存儲方式
    • 1.1 關系型數據庫:結構化數據的堅實堡壘
    • 1.2 非關系型數據庫:靈活應對多樣數據
    • 1.3 如何抉擇:關鍵因素考量
  • 二、數據存儲的性能優化
    • 2.1 批量操作:提升效率的利器
    • 2.2 數據壓縮:節省空間與加速傳輸
    • 2.3 索引優化:加速數據查詢
  • 三、數據備份與恢復策略
    • 3.1 關系型數據庫的備份與恢復
    • 3.2 非關系型數據庫的備份與恢復
    • 3.3 備份與恢復的最佳實踐


一、根據數據特點選擇合適的存儲方式

在爬蟲項目中,數據存儲是至關重要的一環,選擇合適的存儲方式能夠顯著影響項目的性能、可維護性以及數據的有效利用。而關系型數據庫和非關系型數據庫在不同的數據場景下各有優劣,下面我們來深入探討如何根據數據特點進行選擇。

1.1 關系型數據庫:結構化數據的堅實堡壘

關系型數據庫,如 MySQL、Oracle 等,是基于關系模型來組織數據的數據庫。它以行和列的形式存儲數據,就像一張張整齊的表格,一組表共同組成了數據庫。這種存儲方式使得數據的結構非常清晰,便于理解和管理。同時,關系型數據庫遵循 ACID 原則,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),這確保了數據操作的可靠性和數據的一致性 。

在爬蟲項目中,如果采集的數據具有明確的結構和關系,對數據一致性要求較高,關系型數據庫就是一個很好的選擇。比如,在爬取電商網站數據時,用戶信息包含用戶名、密碼、聯系方式、地址等字段,這些字段的結構固定,且相互之間存在關聯。訂單數據則涉及訂單編號、用戶 ID、商品信息、下單時間、訂單狀態等,訂單與用戶、商品之間存在著復雜的關聯關系。使用關系型數據庫,我們可以通過定義表結構和約束,如主鍵約束保證數據的唯一性,外鍵約束建立表與表之間的關聯,從而確保數據的完整性和一致性。同時,關系型數據庫強大的 SQL 查詢語言,可以方便地進行復雜查詢,如統計某用戶的訂單數量、查詢某時間段內的訂單明細等。

1.2 非關系型數據庫:靈活應對多樣數據

非關系型數據庫,如 MongoDB、Redis 等,打破了傳統關系型數據庫的表格結構束縛,以更加靈活的數據模式存儲數據。它們通常不需要預先定義嚴格的數據結構,可以在運行時動態添加或修改字段,這使得它們在處理非結構化、半結構化數據時具有極大的優勢。

MongoDB 是一種文檔型非關系型數據庫,它以類似 JSON 的文檔形式存儲數據,每個文檔可以有不同的字段和結構。在爬蟲項目中,當我們爬取網頁內容時,網頁的文本、圖片鏈接、JSON 格式的 API 數據等,這些數據結構不固定,使用關系型數據庫存儲會非常困難。而 MongoDB 可以輕松地存儲這些數據,我們可以將每個網頁的內容作為一個文檔存儲,文檔中的字段可以根據網頁的實際內容動態變化。例如,爬取新聞網站時,一篇新聞文檔可以包含標題、作者、發布時間、正文、圖片鏈接等字段,不同新聞的圖片鏈接數量和正文格式可能不同,但 MongoDB 都能很好地處理。

Redis 則是一種基于內存的鍵值對存儲數據庫,它的數據讀寫速度極快,主要用于緩存、消息隊列、實時數據存儲等場景。在爬蟲中,我們可以利用 Redis 存儲爬取任務隊列,將待爬取的 URL 作為鍵,相關的任務信息作為值存儲在 Redis 中。多個爬蟲進程可以從隊列中獲取任務,并發地進行爬取,大大提高了爬蟲的效率。同時,Redis 還支持多種數據結構,如字符串、哈希、列表、集合、有序集合等,能夠滿足不同的業務需求。例如,使用有序集合可以實現爬蟲的優先級隊列,根據 URL 的重要性或爬取優先級進行排序。

1.3 如何抉擇:關鍵因素考量

面對關系型數據庫和非關系型數據庫,在爬蟲項目中該如何抉擇呢?這需要綜合考慮多個關鍵因素。

  • 數據一致性:如果數據的一致性至關重要,如涉及金融交易、用戶賬戶信息等數據,關系型數據庫的 ACID 特性能夠保證數據在并發操作下的一致性和完整性,應優先選擇關系型數據庫。而對于一些對數據一致性要求不高,允許存在一定程度數據最終一致性的場景,如日志數據、統計數據等,非關系型數據庫則更為合適。
  • 讀寫性能:關系型數據庫在處理大量數據的高并發讀寫時,由于其磁盤 I/O 和復雜的事務處理機制,性能可能會受到較大影響。而非關系型數據庫,尤其是基于內存的數據庫,如 Redis,具有極高的讀寫速度,適合處理高并發的讀寫請求。如果爬蟲項目中需要頻繁地讀寫數據,且對讀寫性能要求較高,非關系型數據庫可能是更好的選擇。
  • 擴展性:關系型數據庫在擴展時,通常采用縱向擴展的方式,即通過提升硬件性能(如增加內存、更換更快的 CPU 等)來提高處理能力,但這種擴展方式存在一定的局限性。非關系型數據庫則大多支持橫向擴展,通過增加服務器節點來分擔負載,能夠輕松應對數據量的快速增長。如果預計爬蟲項目的數據量會迅速增長,需要具備良好的擴展性,非關系型數據庫更具優勢。
  • 數據結構:根據數據的結構特點來選擇存儲方式。對于結構化數據,關系型數據庫能夠很好地發揮其優勢,通過表結構和約束來管理數據。對于非結構化、半結構化數據,非關系型數據庫的靈活數據模式則更能適應數據的多樣性。

二、數據存儲的性能優化

在數據存儲過程中,除了選擇合適的存儲方式,性能優化也是至關重要的環節。通過采用批量操作、數據壓縮、索引優化等策略,可以顯著提升數據存儲和查詢的效率,降低資源消耗,讓爬蟲項目更加高效穩定地運行。

2.1 批量操作:提升效率的利器

在爬蟲項目中,頻繁地與數據庫進行單條數據的插入、更新或刪除操作,會帶來大量的數據庫交互開銷,嚴重影響性能。批量操作則是解決這一問題的有效手段,它允許我們一次性對多條數據進行操作,大大減少了數據庫的交互次數。

在關系型數據庫中,以 MySQL 為例,使用executemany()方法可以實現批量插入數據。假設我們爬取了一批電商商品數據,要插入到數據庫中,代碼示例如下:

import pymysql# 連接數據庫
connection = pymysql.connect(host='localhost',user='your_username',password='your_password',database='your_dbname',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)try:with connection.cursor() as cursor:# 批量插入數據sql = "INSERT INTO products (product_name, price, stock) VALUES (%s, %s, %s)"data = [('商品1', 19.9, 100),('商品2', 29.9, 200),('商品3', 39.9, 150)]cursor.executemany(sql, data)connection.commit()
finally:connection.close()

在這個示例中,executemany()方法將data列表中的多條數據一次性插入到products表中,相比逐條插入,極大地提高了插入效率。

對于更新和刪除操作,同樣可以通過構建合適的 SQL 語句來實現批量操作。例如,要批量更新商品的庫存:

import pymysqlconnection = pymysql.connect(host='localhost',user='your_username',password='your_password',database='your_dbname',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)try:with connection.cursor() as cursor:# 批量更新數據sql = "UPDATE products SET stock = %s WHERE product_name = %s"data = [(80, '商品1'),(150, '商品2'),(120, '商品3')]cursor.executemany(sql, data)connection.commit()
finally:connection.close()

在非關系型數據庫中,以 MongoDB 為例,使用insert_many()方法進行批量插入。假設我們爬取了一批新聞數據,要插入到 MongoDB 中:

from pymongo import MongoClient# 連接MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['your_dbname']
collection = db['news']data = [{'title': '新聞1','content': '這是新聞1的內容','author': '作者1'},{'title': '新聞2','content': '這是新聞2的內容','author': '作者2'},{'title': '新聞3','content': '這是新聞3的內容','author': '作者3'}
]result = collection.insert_many(data)
print(result.inserted_ids)

通過批量操作,不僅減少了數據庫的負載,還提高了數據處理的效率,尤其在處理大量數據時,效果更為顯著。

2.2 數據壓縮:節省空間與加速傳輸

隨著爬蟲項目中數據量的不斷增長,數據存儲的空間成本和傳輸成本也隨之增加。數據壓縮技術可以有效地解決這一問題,它通過特定的算法對數據進行處理,減少數據在存儲和傳輸過程中占用的空間,從而節省存儲空間,加速數據傳輸。

常見的壓縮算法有 Gzip、Bzip2 等。Gzip 是一種廣泛使用的無損壓縮算法,它基于 DEFLATE 算法,具有較高的壓縮比和較快的壓縮速度,在網絡傳輸和文件存儲中應用非常普遍。Bzip2 則是另一種無損壓縮算法,它的壓縮比通常比 Gzip 更高,但壓縮和解壓縮的速度相對較慢。

在 Python 中,使用gzip模塊可以很方便地對數據進行壓縮和解壓縮。假設我們要將爬取的網頁內容壓縮后存儲:

import gzip# 爬取的網頁內容
html_content = "<html>...</html>"# 壓縮數據
compressed_data = gzip.compress(html_content.encode('utf-8'))# 存儲壓縮后的數據
with open('compressed_data.gz', 'wb') as f:f.write(compressed_data)# 讀取壓縮數據并解壓縮
with open('compressed_data.gz', 'rb') as f:decompressed_data = gzip.decompress(f.read())print(decompressed_data.decode('utf-8'))

在這個示例中,首先使用gzip.compress()方法對網頁內容進行壓縮,然后將壓縮后的數據存儲到文件中。在需要使用數據時,通過gzip.decompress()方法對數據進行解壓縮。

數據壓縮不僅可以節省存儲空間,還能在數據傳輸過程中減少網絡帶寬的占用,提高傳輸速度。例如,在將爬蟲數據傳輸到遠程服務器進行存儲或處理時,先對數據進行壓縮,再進行傳輸,可以大大縮短傳輸時間,提高系統的整體性能。

2.3 索引優化:加速數據查詢

索引是數據庫中一種重要的數據結構,它可以加快數據的查詢速度。在關系型數據庫中,索引就像是一本書的目錄,通過索引可以快速定位到所需的數據行,避免全表掃描,從而顯著提高查詢效率。

常見的索引類型有主鍵索引、唯一索引、復合索引等。主鍵索引是一種特殊的唯一索引,用于唯一標識表中的每一行數據,每個表只能有一個主鍵索引。唯一索引保證索引列中的數據唯一,不允許出現重復值。復合索引則是由多個列組成的索引,它可以提高涉及多個列的查詢效率。

以 MySQL 為例,創建索引的語法如下:

-- 創建普通索引
CREATE INDEX idx_product_name ON products (product_name);-- 創建唯一索引
CREATE UNIQUE INDEX idx_unique_email ON users (email);-- 創建復合索引
CREATE INDEX idx_name_age ON users (name, age);

在創建索引時,需要根據實際的查詢需求來選擇合適的索引類型和索引列。例如,如果經常需要根據商品名稱查詢商品信息,那么在product_name列上創建索引可以大大提高查詢速度。如果查詢條件涉及多個列,如根據用戶的姓名和年齡查詢用戶信息,那么創建包含name和age列的復合索引會更有效。

然而,索引并不是越多越好,創建索引也會帶來一定的維護成本。索引會占用額外的磁盤空間,并且在數據插入、更新和刪除時,數據庫需要更新索引結構,這會增加操作的時間開銷。因此,在創建索引時,需要綜合考慮查詢性能和維護成本,只在必要的列上創建索引,以達到最佳的性能平衡。

三、數據備份與恢復策略

在數據存儲過程中,備份與恢復策略是保障數據安全的關鍵環節。無論使用關系型數據庫還是非關系型數據庫,都需要制定合理的備份計劃和恢復方案,以應對數據丟失、損壞或系統故障等意外情況。下面我們將分別探討關系型數據庫和非關系型數據庫的備份與恢復策略。

3.1 關系型數據庫的備份與恢復

關系型數據庫(如 MySQL、Oracle 等)通常提供了多種備份和恢復方式,以滿足不同場景下的數據保護需求。

  • 全量備份:全量備份是對數據庫中的所有數據進行完整的拷貝。以 MySQL 為例,可以使用mysqldump工具進行全量備份。mysqldump命令可以將數據庫中的數據和表結構導出到一個 SQL 文件中。例如,要備份名為test的數據庫,可以使用以下命令:
mysqldump -u username -p password test > test_backup.sql

在這個命令中,-u指定用戶名,-p提示輸入密碼,test是要備份的數據庫名,test_backup.sql是備份文件的名稱。這種方式簡單直接,恢復時只需將備份文件中的 SQL 語句重新執行即可恢復數據庫。但全量備份的缺點是備份文件較大,備份和恢復的時間較長,尤其是在數據庫數據量較大時。

對于 Oracle 數據庫,可以使用 RMAN(Recovery Manager)進行全量備份。RMAN 是 Oracle 提供的一個強大的備份和恢復工具,它可以對數據庫進行全量備份、增量備份等多種備份操作。使用 RMAN 進行全量備份的示例命令如下:

RUN {ALLOCATE CHANNEL c1 DEVICE TYPE DISK;BACKUP DATABASE FORMAT 'backup_location/%U';RELEASE CHANNEL c1;
}

在這個示例中,ALLOCATE CHANNEL分配一個備份通道,DEVICE TYPE DISK表示使用磁盤作為備份設備,BACKUP DATABASE表示備份整個數據庫,FORMAT指定備份文件的存儲路徑和命名格式。

  • 增量備份:增量備份是只備份自上次備份以來發生變化的數據。對于 MySQL,可以結合二進制日志(binlog)來實現增量備份。首先需要確保 MySQL 開啟了二進制日志功能,在my.cnf配置文件中添加或修改log-bin參數。例如:
[mysqld]
log-bin=/var/log/mysql/mysql-bin.log

在進行全量備份后,每天定時使用mysqladmin flush-logs命令生成新的二進制日志文件,這些新生成的二進制日志文件就記錄了自上次全量備份或增量備份以來的所有數據庫操作。恢復時,先恢復全量備份,然后按照順序應用二進制日志文件,就可以將數據庫恢復到最新狀態。

在 Oracle 中,增量備份分為級別 0 增量備份和級別 1 增量備份。級別 0 增量備份實際上與全量備份相似,包含所有數據塊,它作為后續級別 1 增量備份的基礎。級別 1 增量備份僅備份自上次增量備份以來發生變化的數據塊。使用 RMAN 進行級別 1 增量備份的示例命令如下:

RUN {ALLOCATE CHANNEL c1 DEVICE TYPE DISK;BACKUP INCREMENTAL LEVEL 1 DATABASE FORMAT 'backup_location/inc_lvl1_%U';RELEASE CHANNEL c1;
}

恢復時,需要先恢復級別 0 增量備份,然后再依次應用后續的級別 1 增量備份。

  • 差異備份:差異備份是備份自上次全量備份以來發生變化的數據。在 MySQL 中,通過結合全量備份和二進制日志,也可以實現類似差異備份的效果。在恢復時,同樣先恢復全量備份,然后應用記錄了自全量備份以來所有變化的二進制日志文件。

在 Oracle 中,差異增量備份是備份上次進行的同級或低級備份以來所有變化的數據塊。使用 RMAN 進行差異增量備份的命令與級別 1 增量備份類似,只是在BACKUP命令中指定INCREMENTAL LEVEL 1 DIFFERENTIAL:

RUN {ALLOCATE CHANNEL c1 DEVICE TYPE DISK;BACKUP INCREMENTAL LEVEL 1 DIFFERENTIAL DATABASE FORMAT 'backup_location/diff_inc_lvl1_%U';RELEASE CHANNEL c1;
}

在不同場景下,應根據數據的更新頻率、恢復時間目標(RTO)和恢復點目標(RPO)等因素來選擇合適的備份策略。如果數據更新頻繁,且對恢復時間要求較高,可能需要采用全量備份結合頻繁增量備份的策略;如果數據相對穩定,且允許較長的恢復時間,可以適當減少增量備份的頻率,采用全量備份結合差異備份的方式。

3.2 非關系型數據庫的備份與恢復

非關系型數據庫由于其數據結構和存儲方式的不同,備份和恢復機制也與關系型數據庫有所差異。

  • MongoDB 的備份與恢復:MongoDB 提供了mongodump和mongorestore工具來進行備份和恢復操作。mongodump命令可以將數據庫中的數據導出為 BSON(Binary JSON)格式的文件。例如,要備份整個 MongoDB 數據庫,可以使用以下命令:
mongodump --uri="mongodb://username:password@localhost:27017" --out /backup/mongodb/

在這個命令中,–uri指定 MongoDB 的連接字符串,包括用戶名、密碼、主機和端口,–out指定備份文件的輸出目錄。mongodump還支持備份指定的數據庫或集合,以及使用–gzip選項對備份文件進行壓縮,以減少存儲空間占用。
恢復時,使用mongorestore命令。例如,要將備份數據恢復到 MongoDB 中,可以使用以下命令:

mongorestore --uri="mongodb://username:password@localhost:27017" /backup/mongodb/

mongorestore會將指定目錄下的備份文件中的數據恢復到 MongoDB 中。如果需要恢復到指定的數據庫或集合,可以使用–db和–collection選項進行指定。

  • Redis 的備份與恢復:Redis 支持 RDB(Redis Database)和 AOF(Append Only File)兩種持久化機制,這兩種機制也可以用于數據備份和恢復。

RDB 持久化是將 Redis 內存中的數據以快照的形式保存到磁盤上。Redis 配置文件中默認開啟了 RDB 持久化,并且可以通過配置save參數來設置觸發 RDB 持久化的條件。例如:

save 900 1
save 300 10
save 60 10000

這表示在 900 秒內如果有至少 1 個鍵被更改,或者 300 秒內有至少 10 個鍵被更改,或者 60 秒內有至少 10000 個鍵被更改,就會觸發 RDB 持久化。可以手動執行bgsave命令來觸發 RDB 持久化,bgsave會在后臺創建一個子進程來進行快照操作,不會阻塞 Redis 的正常運行。恢復時,只需將 RDB 文件拷貝到 Redis 配置文件指定的目錄(dir參數指定),然后啟動 Redis,Redis 會自動加載 RDB 文件并恢復數據。

AOF 持久化是將 Redis 執行的寫命令以日志的形式追加到 AOF 文件中。默認情況下,AOF 是關閉的,需要在配置文件中開啟appendonly選項。AOF 文件中的命令可以在 Redis 重啟時用于重建數據集。AOF 持久化有三種同步策略:always(每次寫操作都同步到磁盤)、everysec(每秒同步一次)和no(由操作系統決定何時同步)。可以通過appendfsync參數來設置同步策略。例如:

appendfsync everysec

AOF 文件會隨著寫操作的增加而不斷增大,Redis 提供了bgrewriteaof命令來對 AOF 文件進行重寫,壓縮 AOF 文件的大小。恢復時,將 AOF 文件拷貝到指定目錄,啟動 Redis 后,Redis 會讀取 AOF 文件中的命令并執行,從而恢復數據。如果同時開啟了 RDB 和 AOF 持久化,Redis 在重啟時會優先使用 AOF 文件來恢復數據,因為 AOF 文件通常包含了更完整的數據。

3.3 備份與恢復的最佳實踐

無論是關系型數據庫還是非關系型數據庫,在實施備份與恢復策略時,都需要遵循一些最佳實踐,以確保數據的安全性和可恢復性。

  • 定期驗證備份數據:備份數據的完整性和可恢復性至關重要。因此,需要定期對備份數據進行驗證和測試。可以通過模擬數據丟失或系統故障的場景,使用備份數據進行恢復操作,檢查恢復后的數據是否完整、準確,各項業務功能是否正常。對于關系型數據庫,可以使用備份文件進行恢復,并運行一些測試用例來驗證數據庫的一致性和功能性;對于非關系型數據庫,同樣需要進行恢復測試,確保恢復的數據與原始數據一致。
  • 選擇合適的備份存儲位置:備份數據的存儲位置應考慮安全性、可靠性和可訪問性。可以采用本地與異地備份結合的方式,本地備份便于快速恢復數據,異地備份則可以防止本地存儲設備損壞或遭受自然災害等導致的數據丟失。例如,可以將備份數據存儲在本地的磁盤陣列或 NAS 設備上,同時定期將備份數據復制到遠程的云存儲服務中。在選擇云存儲服務時,要確保其具備良好的數據冗余和恢復機制,以及高可用性和安全性。
  • 加密備份數據:為了防止備份數據在存儲和傳輸過程中被未授權訪問,應對備份數據進行加密。可以使用數據庫自帶的加密功能,如 Oracle 的透明數據加密(TDE),也可以使用第三方加密工具對備份文件進行加密。加密密鑰的管理也非常重要,要確保密鑰的安全性和可管理性,防止密鑰丟失或泄露。
  • 制定備份策略和計劃:根據數據的重要性、更新頻率和恢復要求,制定詳細的備份策略和計劃。明確備份的類型(全量備份、增量備份、差異備份等)、備份的時間間隔、備份文件的保存期限等。例如,對于核心業務數據,可以每天進行一次全量備份,每小時進行一次增量備份;對于一些非關鍵數據,可以每周進行一次全量備份。同時,要將備份策略和計劃納入到整個數據管理體系中,與其他數據管理流程(如數據存儲、數據處理等)進行協調和整合。

通過合理選擇備份方式、定期驗證備份數據、選擇合適的存儲位置和制定完善的備份策略,能夠有效保障數據的安全,提高系統的可靠性和穩定性,確保在面對各種意外情況時,能夠快速、準確地恢復數據,減少數據丟失帶來的損失。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895946.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【復現DeepSeek-R1之Open R1實戰】系列8:混合精度訓練、DeepSpeed、vLLM和LightEval介紹

這里寫目錄標題 1 混合精度訓練1.1 FP16和FP321.2 優點1.3 存在的問題1.4 解決辦法 2 DeepSpeed3 vLLM3.1 存在的問題3.2 解決方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解碼場景 3.3 結論 4 LightEval4.1 主要功能4.2 使用方法4.3 應用場景 本文繼續深入了解O…

使用 FFmpeg 剪輯視頻指南

FFmpeg 是一個功能強大的多媒體處理工具&#xff0c;可以進行視頻和音頻的剪輯、合并、轉碼等操作。本文將詳細介紹如何使用 FFmpeg 進行視頻剪輯&#xff0c;并通過實例幫助你快速掌握剪輯技巧。我們會從最基礎的剪切功能講起&#xff0c;再延伸到一些高級操作&#xff0c;如指…

【分布式理論15】分布式調度1:分布式資源調度的由來與過程

文章目錄 一、操作系統的資源調度&#xff1a;從單核到多核二、 分布式系統的資源調度&#xff1a;從單臺服務器到集群三、 固定資源映射四、 動態資源分配&#xff1a;靈活的任務-資源匹配五、 資源調度過程&#xff1a;從申請到執行 本文主要討論主題&#xff1a; 從操作系統…

【Linux C/C++開發】Linux系統輕量級的隊列緩存mqueue

前言 開發設計時&#xff0c;通常會對業務流程進行模塊化&#xff0c;有些流程之間&#xff0c;不要求同步&#xff0c;但又需要傳遞信息時&#xff0c;如果存儲到數據庫&#xff0c;效率降低很多&#xff0c;如果是存放在內存是最好的。此時可以選擇系統的IPC&#xff08;進程…

Vue 實現通過URL瀏覽器本地下載 PDF 和 圖片

1、代碼實現如下&#xff1a; 根據自己場景判斷 PDF 和 圖片&#xff0c;下載功能可按下面代碼邏輯執行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下載if (item.format pdf) {const response await fetch(item.url); // URL傳遞進入i…

計算機網絡基礎雜談(局域網、ip、子網掩碼、網關、DNS)

目錄 1. 簡單局域網的構成 2. IP 地址 3. 子網掩碼 4. IP地址詳解自定義IP 5. IP 地址詳解 6. 網關 7. DNS 域名解析 8. ping 1. 簡單局域網的構成 交換機是組建局域網最重要的設備&#xff0c;換句話說&#xff0c;沒有交換機就沒法搭建局域網 交換機不能讓局域網連…

Thor: 統一AI模型網關的革新之選

項目價值 Thor(雷神托爾)作為一個強大的AI模型管理網關&#xff0c;解決了當前AI領域一個關鍵痛點&#xff1a;不同AI服務商的API格式各異&#xff0c;集成成本高。Thor通過將各種AI模型的獨特格式統一轉換為OpenAI格式&#xff0c;顯著降低了開發者的使用門檻和維護成本。 核…

25年2月通信基礎知識補充:多普勒頻移與多普勒擴展、3GPP TDL信道模型

看文獻過程中不斷發現有太多不懂的基礎知識&#xff0c;故長期更新這類blog不斷補充在這過程中學到的知識。由于這些內容與我的研究方向并不一定強相關&#xff0c;故記錄不會很深入請見諒。 【通信基礎知識補充7】25年2月通信基礎知識補充1 一、多普勒頻移與多普勒擴展傻傻分不…

【Python】Python入門——筆記合集

哈哈 00、環境搭建 學習Python&#xff0c;首先需要搭建一個本地開發環境&#xff0c;或是使用線上開發環境&#xff08;各類練習網站&#xff09;&#xff0c;這篇博客里主要記錄了本地開發環境的配置方法。內容包括python解釋器的安裝以及pycharm的安裝、漢化等。 博客地…

為什么mvcc中?m_ids 列表并不等同于 min_trx_id 和 max_trx_id 之間的所有事務 ID

首先我們要明確 m_ids 表示創建 ReadView 時&#xff0c;系統中所有活躍&#xff08;未提交&#xff09;事務的事務 ID 列表。 僅包含當前未提交的事務&#xff0c;與事務 ID 的數值范圍無關。 min_trx_id 是 m_ids 中的最小值。若 m_ids 為空&#xff0c;則 min_trx_id 等于…

使用 Spark NLP 實現中文實體抽取與關系提取

在自然語言處理(NLP)領域,實體抽取和關系提取是兩個重要的任務。實體抽取用于從文本中識別出具有特定意義的實體(如人名、地名、組織名等),而關系提取則用于識別實體之間的關系。本文將通過一個基于 Apache Spark 和 Spark NLP 的示例,展示如何實現中文文本的實體抽取和…

FPGA開發要學些什么?如何快速入門?

隨著FPGA行業的不斷發展&#xff0c;政策的加持和投入的研發&#xff0c;近兩年FPGA行業的薪資也是水漲船高&#xff0c;一些人轉行后拿到了薪資30W&#xff0c;甚至有一些能力強的人可以拿到60W&#xff0c;看到這里想必不少人表示很心動&#xff0c;但又不知道怎么轉&#xf…

使用Python和正則表達式爬取網頁中的URL數據

在數據抓取和網絡爬蟲開發中&#xff0c;提取網頁中的URL是一個常見的需求。無論是用于構建網站地圖、分析鏈接結構&#xff0c;還是進行內容聚合&#xff0c;能夠高效地從HTML文檔中提取URL都是一個重要的技能。Python作為一種強大的編程語言&#xff0c;結合其正則表達式模塊…

人工智能之目標追蹤DeepSort源碼解讀(yolov5目標檢測,代價矩陣,余弦相似度,馬氏距離,匹配與預測更新)

要想做好目標追蹤,須做好目標檢測,所以這里就是基于yolov5檢測基礎上進行DeepSort,叫它為Yolov5_DeepSort。整體思路是先檢測再追蹤,基于檢測結果進行預測與匹配。 一.參數與演示 這里用到的是coco預訓練人的數據集&#xff1a; 二.針對檢測結果初始化track 對每一幀數據都輸出…

C++藍橋杯基礎篇(四)

片頭 嗨~小伙伴們&#xff0c;大家好&#xff01;今天我們來學習C藍橋杯基礎篇&#xff08;四&#xff09;&#xff0c;繼續練習相關習題。準備好了嗎&#xff1f;咱們開始咯~ 題目1 連續整數相加 思路分析&#xff1a; 這道題&#xff0c;我們可以把從鍵盤中讀取n寫在while循…

YOLOv12從入門到入土(含結構圖)

論文鏈接&#xff1a;https://arxiv.org/abs/2502.12524 代碼鏈接&#xff1a;https://github.com/sunsmarterjie/yolov12 文章摘要&#xff1a; 長期以來&#xff0c;增強YOLO框架的網絡架構一直至關重要&#xff0c;但一直專注于基于cnn的改進&#xff0c;盡管注意力機制在建…

SpringSecurity基于配置方法控制訪問權限:MVC匹配器、Ant匹配器

Spring Security 是一個功能強大且高度可定制的身份驗證和訪問控制框架。在 Spring Security 中&#xff0c;可以通過配置方法來控制訪問權限。認證是實現授權的前提和基礎&#xff0c;在執行授權操作前需要明確目標用戶&#xff0c;只有明確目標用戶才能明確它所具備的角色和權…

【iOS】SwiftUI狀態管理

State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通過 Published 標記的變量會觸發視圖更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…

跟著 Lua 5.1 官方參考文檔學習 Lua (3)

文章目錄 2.5 – Expressions2.5.1 – Arithmetic Operators2.5.2 – Relational Operators2.5.3 – Logical Operators2.5.4 – Concatenation2.5.5 – The Length Operator2.5.6 – Precedence2.5.7 – Table Constructors2.5.8 – Function Calls2.5.9 – Function Definiti…

(LLaMa Factory)大模型訓練方法--監督微調(Qwen2-0.5B)

1、準備訓練數據&#xff1a;SFT 的數據格式有多種&#xff0c;例如&#xff1a;Alpaca格式、OpenAI格式等。 #其中Alpaca格式如下&#xff1a;[{"instruction":"human instruction (required)","input":"human input (optional)",&qu…