Brown, Daniel wrote:
> I just upgraded to the latest version (3.6.1) of the pre-processed C
> source code from the website, running the test again gives me similar
> results of 22.2 MB used and 24.55 MB high water from the same 9 MB file.
> Is there any way it could be the file that is causing the extra memory
> usage?  I'll try rebuilding it next.

I just tried your test code with sqlite 3.6.1 amalgamation source on Win 
XP and I get the following output from a 17.5 MB (18,362,368 bytes) 
database file.

     Entries.db   Used: 18049 KB   High: 20357 KB

I had to make a few changes to your code to get it to run. I have copied 
the modified code below. This was built with Dev-Cpp using GCC 3.4.2.

There must be some other issue with your program that is causing the 
inflated memory usage you are seeing.

Dennis Cote

#include <cstdlib>
#include <cstdio>
#include <sqlite3.h>

using namespace std;

int main(int argc, char *argv[])
        sqlite3* pDataBase = NULL;
     const char* ptail = NULL;
        sqlite3_stmt* pstatement = NULL;
        int result = -1;
        int cmdSize = 0;
        const int cmdBufferSize = 1024;
        char cmdBuffer[cmdBufferSize];
        const char* pdatabaseName = "file_db";
        const char* pfilename = argv[1];

        sqlite3_open( ":memory:", &pDataBase );

        // create the attach command
        cmdSize = sprintf( cmdBuffer, "ATTACH DATABASE '%s' AS %s", pfilename, 
pdatabaseName );

        // attach the on-disk database with ATTACH filename.db AS filename
        result = sqlite3_exec( pDataBase, cmdBuffer, NULL, NULL, NULL );

        // You can enumerate all tables in a your on-disk-file in the mentioned 
scenario by
        // doing a "SELECT tbl_name FROM filename.sqlite_master WHERE type = 
        cmdSize = sprintf( cmdBuffer, "SELECT tbl_name FROM %s.sqlite_master 
WHERE type = 'table'", pdatabaseName );

        // prepare the statement
        result = sqlite3_prepare_v2( pDataBase, cmdBuffer, cmdSize, 
&pstatement, &ptail);

        while( sqlite3_step( pstatement) == SQLITE_ROW)
                // Then do a CREATE TABLE tableName AS SELECT * FROM 
filename.tableName On each table in the file,
                // thus creating an in-memory copy of the DB and having done a 
on each table (i.e. you'll see how                      // much cache in memory 
will be 
used, etc.)     

                // get the table name
                const unsigned char* pname = sqlite3_column_text( pstatement, 

                // construct the command
                cmdSize = sprintf( cmdBuffer, "CREATE TABLE %s AS SELECT * FROM 
%s.%s", pname, pdatabaseName, pname );

                result = sqlite3_exec( pDataBase, cmdBuffer, NULL, NULL, NULL );


        // detach the attached database to leave just the in memory database
        cmdSize = sprintf( cmdBuffer, "DETACH DATABASE %s", pdatabaseName );

        result = sqlite3_exec( pDataBase, cmdBuffer, NULL, NULL, NULL );

        sqlite_int64 memHigh = sqlite3_memory_highwater(0);
        sqlite_int64 memUsed = sqlite3_memory_used();

        printf("%s   Used: %d KB   High: %d KB\n", pfilename, 
(int)(memUsed/1024), (int)(memHigh/1024));

        sqlite3_close( pDataBase );

     return EXIT_SUCCESS;
sqlite-users mailing list

Reply via email to