I am a newbie using BDB. I am to testing the performance of BDB when
paging occurs. My test scenario:
Machine: 4 G RAM and 4 CPUs
OS: Windows 2000 server
Cache size: 1.5 G
Rows: 10 M
Row size: 104 bytes (one int key column and 9 char[11] columns)
It took me 4 hours to insert 10M rows into a Btree DB. Inserting the
same amount of rows into MSSQL running on the same machine only took
800 seconds.
Any options/flags I can set to make it run faster?
My program:
=============
// test.cpp : Defines the entry point for the console application.
//
#include <db_cxx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <map>
#ifdef _WIN32
extern "C" {
extern int getopt(int, char * const *, const char *);
extern char *optarg;
}
#else
#include <unistd.h>
#endif
using namespace std;
typedef struct _testRow
{
int rowNum;
char c1[11];
char c2[11];
char c3[11];
char c4[11];
char c5[11];
char c6[11];
char c7[11];
char c8[11];
char c9[11];
} testRow;
int
usage()
{
fprintf(stderr, "example_database_read: \n");
fprintf(stderr, " [-h <database home>, default ./ ]\n");
fprintf(stderr, " [-c <Cache size in Megabytes (50M - 1800M)>, default
200] \n");
fprintf(stderr, " [-p <Page size in Kilobytes (1K - 64K)>, default
4]\n");
fprintf(stderr, " [-r <Number of rows to insert (10000 -
100000000)>, default 1000000]\n");
fprintf(stderr, " [-t <table type: B - for Btree, H - for Hash >,
default Btree]\n");
fprintf(stderr,
"\nNote: Any path specified to the -h parameter must end\n");
fprintf(stderr, " with your system's path delimiter (/ or \\)\n");
return (-1);
}
char *db_home_dir = NULL;
int cacheSize = 200, pageSize = 4, totalRows = 1000000, cSize;
int noSync = 1;
DBTYPE tableType = DB_BTREE;
int bdb_write();
int bdb_read();
int map_write();
int map_read();
int main(int argc, char* argv[])
{
int ch, ret;
int cSize;
char type;
while ((ch = getopt(argc, argv, "h:c

:r:t:?")) != EOF)
{
switch (ch)
{
case 'h':
if (optarg[strlen(optarg)-1] != '/' && optarg[strlen(optarg)-1] !=
'\\')
return (usage());
db_home_dir = optarg;
printf("DB home directory set to %s.\n", db_home_dir);
break;
case 'c':
cSize = atoi(optarg);
if (cSize > 50 && cSize < 1800)
cacheSize = cSize;
printf("Cache size set to %i Megabtyes.\n", cacheSize);
break;
case 'p':
cSize = atoi(optarg);
if (cSize >=1 && cSize <= 64)
pageSize = cSize;
printf("Page size set to %i Kilobtyes.\n", pageSize);
break;
case 'r':
cSize = atoi(optarg);
if (cSize > 10000 && cSize < 100000000)
totalRows = cSize;
printf("Total rows to insert set to %i.\n", totalRows);
break;
case 't':
type = optarg[0];
if (type == 'H')
tableType = DB_HASH;
break;
case '?':
default:
return (usage());
}
}
ret = bdb_write();
if (ret !=0 )
printf("bdb_write failed, ret = %i", ret);
ret = bdb_read();
if (ret !=0 )
printf("bdb_read failed, ret = %i", ret);
}
int bdb_write()
{
DB *dbp;
int ret = db_create(&dbp, NULL, 0);
if (ret != 0)
{
printf("db_create failed, ret = %i", ret);
return (ret);
}
ret = dbp->set_cachesize(dbp, 0, cacheSize * 1024 * 1024, 0);
if (ret != 0)
{
printf("set_cachesize failed, ret = %i", ret);
return (ret);
}
ret = dbp->set_pagesize(dbp, pageSize * 1024 );
if (ret != 0)
{
printf("set_pagesize failed, ret = %i", ret);
return (ret);
}
char dbFile[512];
if (db_home_dir != NULL)
sprintf(dbFile, "%stest.db", db_home_dir);
else
strcpy(dbFile, "./test.db");
ret = dbp->open(dbp, NULL, dbFile, NULL, tableType, DB_CREATE |
DB_TRUNCATE, 0);
if (ret != 0)
{
printf("DB open failed, ret = %i, Error msg = %s \n", ret,
db_strerror(ret));
return (ret);
}
time_t now;
now = time(0L);
printf("DB open for write at %s\n", ctime(&now));
int rowNum = 0;
DBT key, data;
testRow row;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
memset (&row, 0, sizeof(testRow));
memcpy (row.c1, "AAAAAAAAAA", 10);
memcpy (row.c2, "AAAAAAAAAA", 10);
memcpy (row.c3, "AAAAAAAAAA", 10);
memcpy (row.c4, "AAAAAAAAAA", 10);
memcpy (row.c5, "AAAAAAAAAA", 10);
memcpy (row.c6, "AAAAAAAAAA", 10);
memcpy (row.c7, "AAAAAAAAAA", 10);
memcpy (row.c8, "AAAAAAAAAA", 10);
memcpy (row.c9, "AAAAAAAAAA", 10);
int size = data.size = sizeof(struct _testRow);
now = time(0L);
printf("Insert started at %s\n", ctime(&now));
for (rowNum = 0; rowNum < totalRows; rowNum++)
{
row.rowNum = rowNum;
key.data = &(row.rowNum);
key.size = 4;
/* Set up the database record's data */
data.data = &row;
data.size = size;
ret = dbp->put(dbp, NULL , &key, &data, 0);
if (ret != 0)
{
printf("DB put failed, ret = %i, Error msg = %s \n", ret,
db_strerror(ret));
return (ret);
}
}
now = time(0L);
printf("Insert completed at %s \n", ctime(&now));
if (noSync)
dbp->close(dbp, DB_NOSYNC);
now = time(0L);
printf("Database closed at %s \n", ctime(&now));
return 0;
}
int bdb_read()
{
DB *dbp;
int ret = db_create(&dbp, NULL, 0);
if (ret != 0)
{
printf("db_create failed, ret = %i", ret);
return (ret);
}
ret = dbp->set_cachesize(dbp, 0, cacheSize * 1024 * 1024, 0);
if (ret != 0)
{
printf("set_cachesize failed, ret = %i", ret);
return (ret);
}
ret = dbp->set_pagesize(dbp, pageSize * 1024 );
if (ret != 0)
{
printf("set_pagesize failed, ret = %i", ret);
return (ret);
}
char dbFile[512];
if (db_home_dir != NULL)
sprintf(dbFile, "%stest.db", db_home_dir);
else
strcpy(dbFile, "./test.db");
ret = dbp->open(dbp, NULL, dbFile, NULL, tableType, DB_RDONLY, 0);
if (ret != 0)
{
printf("DB open failed, ret = %i", ret);
return (ret);
}
time_t now;
now = time(0L);
printf("DB open for read at %s\n", ctime(&now));
int rowNum = 0;
DBT key, data;
testRow row;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
/*
memcpy (row.c1, "AAAAAAAAAA", 10);
memcpy (row.c2, "AAAAAAAAAA", 10);
memcpy (row.c3, "AAAAAAAAAA", 10);
memcpy (row.c4, "AAAAAAAAAA", 10);
memcpy (row.c5, "AAAAAAAAAA", 10);
memcpy (row.c6, "AAAAAAAAAA", 10);
memcpy (row.c7, "AAAAAAAAAA", 10);
memcpy (row.c8, "AAAAAAAAAA", 10);
memcpy (row.c9, "AAAAAAAAAA", 10);
*/
int size = data.size = sizeof(struct _testRow);
now = time(0L);
printf("Read started at %s\n", ctime(&now));
for (rowNum = 0; rowNum < totalRows; rowNum++)
{
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
memset(&row, 0, sizeof(testRow));
key.data = &rowNum;
key.size = 4;
key.flags = DB_DBT_USERMEM;
/* Set up the database record's data */
data.data = &row;
data.size = size;
data.ulen = size;
data.flags = DB_DBT_USERMEM;
ret = dbp->get(dbp, NULL , &key, &data, 0);
if (ret != 0)
{
printf("DB get failed, ret = %i \n Error msg = %s", ret,
db_strerror(ret));
return (ret);
}
if (row.rowNum != rowNum)
{
printf("Got wrong result rowNum = %i and got %i", rowNum,
row.rowNum);
return -1;
}
}
now = time(0L);
printf("Read completed at %s \n", ctime(&now));
if (noSync)
dbp->close(dbp, DB_NOSYNC);
now = time(0L);
printf("Database closed at %s \n", ctime(&now));
return 0;
}
=======================
Thanks
David