Created
December 15, 2011 12:58
-
-
Save ayende/1481011 to your computer and use it in GitHub Desktop.
Test file to see why Esent takes big files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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