SQLite 插入大量資料慢的解決方法

2021-09-10 08:48:52 字數 1546 閱讀 8175

sqlite 插入資料很慢的原因:sqlite在沒有顯式使用事務的時候會為每條insert都使用事務操作,而sqlite資料庫是以檔案的形式存在磁碟中,就相當於每次訪問時都要開啟一次檔案,如果對資料進行大量的操作,時間都耗費在i/o操作上,所以很慢。

解決方法是顯式使用事務的形式提交:因為我們開始事務後,進行的大量操作的語句都儲存在記憶體中,當提交時才全部寫入資料庫,此時,資料庫檔案也就只用開啟一次。

我在沒有顯式使用事務形式插入100條資料時用了12.226s;用顯式事務形式,插入100條只用了0.172s,插入1000000條也才34.891s,相關很大吧。

顯式使用事務的例子:

include

include

using namespace std;

include sqlite/sqlite3.h

int main()

sqlite3* db;

int nresult = sqlite3_open(test.db,db);

if (nresult != sqlite_ok)

cout開啟資料庫失敗:sqlite3_errmsg(db)endl; p=

return 0;

else

cout資料庫開啟成功endl; p=

char* errmsg;

nresult = sqlite3_exec(db,create table ****(id integer primary key autoincrement,name varchar(100)),null,null,errmsg);

if (nresult != sqlite_ok)

sqlite3_close(db);

couterrmsg; p=

sqlite3_free(errmsg);

return 0;

string strsql;

strsql+=begin;\n;

for (int i=0;i100;i++)

strsql+=insert into **** values(null,'heh');\n;

strsql+=commit;;

//coutstrsqlendl; p=

systemtime tm_s;

getlocaltime(tm_s);

nresult = sqlite3_exec(db,strsql.c_str(),null,null,errmsg);

systemtime tm_e;

getlocaltime(tm_e);

if (nresult != sqlite_ok)

sqlite3_close(db);

couterrmsgendl; p=

sqlite3_free(errmsg);

return 0;

coutstart:tm_s.wminute:tm_s.wsecond:tm_s.wmillisecondsendl; p=

coutend :tm_e.wminute:tm_e.wsecond:tm_e.wmillisecondsendl; p=

return 0;

SQLite 插入大量資料慢的解決方法

sqlite 插入資料很慢的原因 sqlite在沒有顯式使用事務的時候會為每條insert都使用事務操作,而sqlite資料庫是以檔案的形式存在磁碟中,就相當於每次訪問時都要開啟一次檔案,如果對資料進行大量的操作,時間都耗費在i o操作上,所以很慢。解決方法是顯式使用事務的形式提交 因為我們開始事務...

sqlite大量資料插入優化總結

1.將插入操作放到乙個transaction裡,預設的每條insert語句都會開啟乙個transaction,參見 2.手動拼寫插入語句,不要運用orm,雖然 會看起來很多,但是效率絕對大幅度提公升 未優化前 nsarray organizations organizationsdic allval...

Python使用SQLite插入大量資料耗時問題

使用python爬蟲 ip時,最先使用了sqlite作為儲存ip資料庫,sqlite簡單 靈活 輕量 開源,和檔案系統一樣。而當大量插入爬取的資料時,出現了嚴重的耗時,檢視一起資料後,發現 sqlite在每條insert都使用commit的時候,就相當於每次訪問時都要開啟一次檔案,從而引起了大量的i...