adding "begin transaction" before inserting data
then "commit transaction" will surely boost the inserts
Kalle Last wrote:
>
> Hello,
>
> I'm having a big performance problem while trying to use sqlite as a
> data output for my application. The application writes out a bunch of
> packets relatively fast. There are about 10 different types of them
> with all but one sizing under 100 bytes. Those small ones I write out
> roughly once per second or less. The big one is the "real" data that
> gets logged from ~10-1000x per second. It's size can be from 2-3kb to
> 32kb and it's size depends on other parameters that don't change very
> often, generally not more than every few minutes. Raw data output rate
> is at most ~8MiB/s and generally is around 3-5. At the time of writing
> the files are never altered, just a bunch of data gets added to them
> up to around 1GB is reached, then a new file is created.
>
> When using my current flat-file output it doesn't cause almost any
> measurable system load. When using the DB it pretty much halts the
> application without causing significant CPU load. The data still gets
> logged to DB but at a fraction of the speed it should be (~1MB per 15s
> vs 5MB/s). I'm quite new to sqlite so I'm not really sure how to
> benchmark it or how to know what is causing the slowdown. So far it
> seems if I disable saving the big packets it works perfectly. The
> overhead of using SQLite is needed to be absolutely minimal as the
> application itself is doing a whole lot of raw computations already.
> Flat file output has almost zero overhead but any modifications to
> file format make things quite a bit complicated.
>
> The big packet table is created like this:
>
> char *errMsg = 0;
> sqlite3_exec(db,
> "CREATE TABLE Data ( \
> NumRows INTEGER NOT NULL, \
> NumColumns INTEGER NOT NULL, \
> RowSize FLOAT NOT NULL, \
> Begin FLOAT NOT NULL, \
> End FLOAT NOT NULL, \
> DataBegin FLOAT NOT NULL, \
> DataEnd FLOAT NOT NULL, \
> Timestamp DOUBLE NOT NULL, \
> PacketID INTEGER NOT NULL, \
> Data BLOB NOT NUlL, \
> ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
> 0,
> 0,
> &errMsg);
>
>
> Data is inserted with this piece of code:
>
> DataPing* ping = packet.dataPing;
> const string queryStr = "INSERT INTO DataPing (NumRows,
> NumColumns, Begin, End, DataBegin, DataEnd, Timestamp, PacketID,
> Data)"
> "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
> sqlite3_stmt* query(NULL);
> long rc = SQLITE_OK;
>
>
> if (query == 0) {
> rc = sqlite3_prepare_v2(db, queryStr.c_str(), queryStr.size(),
> &query, NULL);
> if (rc != SQLITE_OK) {
> TRACE_PRINT("error", ("SQL error: %s", sqlite3_errmsg(db)))
> }
> }
>
>
> sqlite3_bind_int( query, 1, ping->numRows);
> sqlite3_bind_double( query, 2, ping->numColumns);
> sqlite3_bind_double( query, 3, ping->begin);
> sqlite3_bind_double( query, 4, ping->end);
> sqlite3_bind_int( query, 5, ping->dataBegin);
> sqlite3_bind_double( query, 6, packet.dataEnd);
> sqlite3_bind_int( query, 7, packet.timestamp);
> sqlite3_bind_int( query, 8, packet.packetId);
> sqlite3_bind_blob( query, 9, &ping->data[0],
> ping->numRows*ping->numColumns*sizeof(ping->data[0]), 0);
> if (rc != SQLITE_OK) {
> TRACE_PRINT("error", ("SQL error: %s", sqlite3_errmsg(db)))
> }
> rc = sqlite3_step(query);
> if (rc != SQLITE_OK && rc!=SQLITE_DONE) {
> TRACE_PRINT("error", ("SQL error: %d: %s", rc,
> sqlite3_errmsg(db)))
> }
> rc = sqlite3_reset(query);
>
>
> Basic data flow is program receives packet -> packet is parsed ->
> packet is logged -> data from packet is used in a lot of computations
> -> packet is destroyed (memory freed)
>
>
> I have no idea how to fine-tune sqlite behavior, if I'm doing the
> querys correctly or if I'm doing something else wrong. I tried to use
> transactions by doing a pair of end/begin queries once per second but
> it didn't seem to change much. Data got saved just fine but it was
> still horribly slow. My best guess at the moment is that program hangs
> because of excessive file synchronization. Anyone has any better
> guesses what could be the problem and how to solve them?
>
> --
> Kalle Last
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
>
--
View this message in context:
http://www.nabble.com/Big-performance-problem-with-inserting-lots-of-data-tp25224450p25234485.html
Sent from the SQLite mailing list archive at Nabble.com.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users