Skip to content

Instantly share code, notes, and snippets.

@ayende
Created December 15, 2011 12:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayende/1481011 to your computer and use it in GitHub Desktop.
Save ayende/1481011 to your computer and use it in GitHub Desktop.
Test file to see why Esent takes big files
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Isam.Esent.Interop;
namespace EsentSize
{
class Program
{
static void Main()
{
var database = "test";
if (Directory.Exists(database))
Directory.Delete(database, true);
SystemParameters.MaxInstances = 1024;
CreateDatabase(database);
ReportDatabaseSize(database);
WriteDocuments(database);
ReportDatabaseSize(database);
}
private static void WriteDocuments(string database)
{
JET_INSTANCE instance = JET_INSTANCE.Nil;
try
{
Configure(database, instance);
Api.JetCreateInstance(out instance, database + Guid.NewGuid());
Api.JetInit(ref instance);
using (var session = new Session(instance))
{
JET_DBID dbid;
Api.JetAttachDatabase(session, Path.Combine(database, "database"), AttachDatabaseGrbit.None);
Api.JetOpenDatabase(session, Path.Combine(database, "database"), null, out dbid, OpenDatabaseGrbit.None);
using (var tx = new Transaction(session))
using (var documents = new Table(session, dbid, "documents", OpenTableGrbit.None))
{
var documentsColumns = Api.GetColumnDictionary(session, documents);
for (int i = 0; i < 1024; i++)
{
using (var update = new Update(session, documents, JET_prep.Insert))
{
Api.SetColumn(session, documents, documentsColumns["key"], "tests/" + i, Encoding.Unicode);
using (Stream stream = new BufferedStream(new ColumnStream(session, documents, documentsColumns["data"])))
{
stream.Write(new byte[1024], 0, 1024);
stream.Flush();
}
Api.SetColumn(session, documents, documentsColumns["etag"], Guid.NewGuid().ToByteArray());
Api.SetColumn(session, documents, documentsColumns["last_modified"], DateTime.UtcNow);
using (Stream stream = new BufferedStream(new ColumnStream(session, documents, documentsColumns["metadata"])))
{
stream.Write(new byte[128], 0, 128);
stream.Flush();
}
update.Save();
}
}
tx.Commit(CommitTransactionGrbit.None);
}
Api.JetCloseDatabase(session, dbid, CloseDatabaseGrbit.None);
}
}
finally
{
Api.JetTerm2(instance, TermGrbit.Complete);
}
}
private static void ReportDatabaseSize(string database)
{
JET_INSTANCE instance = JET_INSTANCE.Nil;
try
{
Configure(database, instance);
Api.JetCreateInstance(out instance, database + Guid.NewGuid());
Api.JetInit(ref instance);
using (var session = new Session(instance))
{
JET_DBID dbid;
Api.JetAttachDatabase(session, Path.Combine(database, "database"), AttachDatabaseGrbit.None);
Api.JetOpenDatabase(session, Path.Combine(database, "database"), null, out dbid, OpenDatabaseGrbit.None);
int value;
Api.JetGetDatabaseInfo(session, dbid, out value, JET_DbInfo.Filesize);
Console.WriteLine("File size is {0:#,#} kb", (value*SystemParameters.DatabasePageSize)/1024);
Api.JetCloseDatabase(session, dbid, CloseDatabaseGrbit.None);
}
}
finally
{
Api.JetTerm2(instance, TermGrbit.Complete);
}
}
private static void CreateDatabase(string database)
{
JET_INSTANCE instance = JET_INSTANCE.Nil;
try
{
Configure(database,instance);
Api.JetCreateInstance(out instance, database + Guid.NewGuid());
Api.JetInit(ref instance);
using (var session = new Session(instance))
{
JET_DBID dbid;
Api.JetCreateDatabase(session, Path.Combine(database, "database"), null, out dbid, CreateDatabaseGrbit.None);
CreateDocumentsTable(session, dbid);
Api.JetCloseDatabase(session, dbid, CloseDatabaseGrbit.None);
}
}
finally
{
Api.JetTerm2(instance, TermGrbit.Complete);
}
}
private static void Configure(string path, JET_INSTANCE jetInstance)
{
new InstanceParameters(jetInstance)
{
CircularLog = true,
Recovery = true,
NoInformationEvent = false,
CreatePathIfNotExist = true,
TempDirectory = Path.Combine(path, "temp"),
SystemDirectory = Path.Combine(path, "system"),
LogFileDirectory = Path.Combine(path, "logs"),
MaxVerPages = 128 * SystemParameters.DatabasePageSize,
BaseName = "RVN",
EventSource = "Raven",
LogBuffers = 2048,
LogFileSize = 4098,
MaxSessions = 256,
MaxCursors = 2048,
DbExtensionSize = 4098,
AlternateDatabaseRecoveryDirectory = path
};
}
private static void CreateDocumentsTable(JET_SESID session, JET_DBID dbid)
{
JET_TABLEID tableid;
Api.JetCreateTable(session, dbid, "documents", 1, 80, out tableid);
JET_COLUMNID columnid;
Api.JetAddColumn(session, tableid, "id", new JET_COLUMNDEF
{
coltyp = JET_coltyp.Long,
grbit = ColumndefGrbit.ColumnFixed | ColumndefGrbit.ColumnAutoincrement | ColumndefGrbit.ColumnNotNULL
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "key", new JET_COLUMNDEF
{
cbMax = 255,
coltyp = JET_coltyp.Text,
cp = JET_CP.Unicode,
grbit = ColumndefGrbit.ColumnTagged
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "etag", new JET_COLUMNDEF
{
cbMax = 16,
coltyp = JET_coltyp.Binary,
grbit = ColumndefGrbit.ColumnFixed | ColumndefGrbit.ColumnNotNULL,
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "last_modified", new JET_COLUMNDEF
{
coltyp = JET_coltyp.DateTime,
grbit = ColumndefGrbit.ColumnFixed | ColumndefGrbit.ColumnNotNULL,
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "locked_by_transaction", new JET_COLUMNDEF
{
cbMax = 16,
coltyp = JET_coltyp.Binary,
grbit = ColumndefGrbit.ColumnTagged,
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "data", new JET_COLUMNDEF
{
coltyp = JET_coltyp.LongBinary,
grbit = ColumndefGrbit.ColumnTagged
}, null, 0, out columnid);
Api.JetAddColumn(session, tableid, "metadata", new JET_COLUMNDEF
{
coltyp = JET_coltyp.LongBinary,
grbit = ColumndefGrbit.ColumnTagged
}, null, 0, out columnid);
var indexDef = "+key\0\0";
Api.JetCreateIndex(session, tableid, "by_key", CreateIndexGrbit.IndexDisallowNull | CreateIndexGrbit.IndexUnique, indexDef, indexDef.Length,
80);
indexDef = "+id\0\0";
Api.JetCreateIndex(session, tableid, "by_id", CreateIndexGrbit.IndexPrimary, indexDef, indexDef.Length,
80);
indexDef = "+etag\0\0";
Api.JetCreateIndex(session, tableid, "by_etag", CreateIndexGrbit.IndexDisallowNull, indexDef, indexDef.Length,
80);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment