簡體   English   中英

使用 Python 將大量數據批量插入 SQLite

[英]Bulk insert huge data into SQLite using Python

我讀到了這個: 使用 Python 將 CSV 文件導入到 sqlite3 數據庫表中

似乎每個人都建議使用逐行讀取而不是使用來自 SQLite 的批量 .import。 但是,如果您有數百萬行數據,這將使插入變得非常緩慢。 有沒有其他方法可以規避這種情況?

更新:我嘗試了以下代碼逐行插入,但速度沒有我預期的那么好。 有沒有辦法改進它

for logFileName in allLogFilesName:
    logFile = codecs.open(logFileName, 'rb', encoding='utf-8')
    for logLine in logFile:
        logLineAsList = logLine.split('\t')
        output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList)
    logFile.close()
connection.commit()
connection.close()

由於這是谷歌搜索的最高結果,我認為更新這個問題可能會很好。

從你可以使用的python sqlite docs

import sqlite3

persons = [
    ("Hugo", "Boss"),
    ("Calvin", "Klein")
]

con = sqlite3.connect(":memory:")

# Create the table
con.execute("create table person(firstname, lastname)")

# Fill the table
con.executemany("insert into person(firstname, lastname) values (?,?)", persons)

我已經使用這種方法一次提交超過 50k 行插入,而且速度非常快。

使用生成器表達式將數據動態分成塊,在事務中插入。 這是sqlite優化常見問題的引用:

除非已經在一個事務中,否則每個 SQL 語句都會為其啟動一個新事務。 這是非常昂貴的,因為它需要為每個語句重新打開、寫入和關閉日志文件。 這可以通過用 BEGIN TRANSACTION 包裝 SQL 語句序列來避免; 並結束交易; 聲明。 對於不改變數據庫的語句,也可以獲得這種加速。

這里是你的代碼可能看起來怎么樣。

此外,sqlite 能夠導入 CSV 文件

Sqlite每秒可以執行數萬次插入,只需確保在單個事務中通過 BEGIN 和 COMMIT 圍繞插入來完成所有這些操作。 (executemany() 會自動執行此操作。)

與往常一樣,在您知道速度會成為問題之前不要進行優化。 首先測試最簡單的解決方案,只有在速度不可接受時才進行優化。

暫無
暫無

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

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