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...