gpt4 book ai didi

C# - ESENT 数据库内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 22:20:13 25 4
gpt4 key购买 nike

我刚开始使用 ESENT ManagedInterface (http://managedesent.codeplex.com/)。我想知道它是否有内存泄漏问题。

我做的很简单。我遵循示例代码,但我在每一行中放入了相当大的字符串数据 (10KB+),总共产生了 10000 行。

当插入更多行时,内存使用量会增加。如果我插入大约 100,000 行,程序将占用 1 GB 内存并死掉。

这是代码。

public static void test()
{
string techcrunchString = @"The Latest from TechCrunch CMU Researchers Turn Any Surface Into A TouchscreenWeb Design Community Treehouse Raises $600K From Reid Hoffman, Kevin Rose, And Others Greylock Looks To Help Portfolio Companies Recruit Talent With New Hires UberMedia Quietly (Inadvertently?) Releases Chime.in, A Mobile Social Networking App T-Mobile Announces The Dual-Screen LG DoublePlay, Launching November 2nd? Watch An iPhone 4S and Samsung Galaxy S II Take Three Nasty Drops Onto Concrete Facebook, NRDC & Opower To Partner On Energy-Saving Social AppCTIAs New Alert Guidelines Could Mean The End Of Bill ShockGrockit Gets A $7 Million Venture Infusion And Launches Video Q&A Site Grockit AnswersGorgeous Photos, Tablet Browsing: 500px Debuts New iPad AppSamsung Galaxy Nexus, HTC Vigor To Launch November 10?Freelance.com: Facebook App, 3D, HTML5, And Cocoa Jobs On The RiseiPhone 4S First Weekend Sales Exceeds 4 Million, Doubles The Pace Of The iPhone 4Wahanda Secures $5.5 Million From Fidelity Growth Partners EuropeLook Out Uber: GroundLink Launches An Affordable, Mobile Private Car Service For New YorkersVideo Collaboration Software Maker ViVu Acquired By PolycomWith 400,000 Users Under Its Belt, SohoOS Plans Major Revamp5 Product Innovations From CEATEC 2011 In Japan (Video Gallery)Digital Media Companies Inuvo And Vertro To MergeRIM Apologizes With Free Apps & Technical Support For Three Days Of DowntimeCMU Researchers Turn Any Surface Into A TouchscreenPosted: 17 Oct 2011 09:14 AM PDT";

JET_INSTANCE instance;
JET_SESID sesid;
JET_DBID dbid;
JET_TABLEID tableid;

JET_COLUMNDEF columndef = new JET_COLUMNDEF();

// Initialize ESENT. Setting JET_param.CircularLog to 1 means ESENT will automatically
// delete unneeded logfiles. JetInit will inspect the logfiles to see if the last
// shutdown was clean. If it wasn't (e.g. the application crashed) recovery will be
// run automatically bringing the database to a consistent state.
Api.JetCreateInstance(out instance, "instance");
Api.JetSetSystemParameter(instance, JET_SESID.Nil, JET_param.CircularLog, 1, null);
Api.JetInit(ref instance);
Api.JetBeginSession(instance, out sesid, null, null);

// Create the database. To open an existing database use the JetAttachDatabase and
// JetOpenDatabase APIs.
Api.JetCreateDatabase(sesid, "edbtest.db", null, out dbid, CreateDatabaseGrbit.OverwriteExisting);

// Create the table. Meta-data operations are transacted and can be performed concurrently.
// For example, one session can add a column to a table while another session is reading
// or updating records in the same table.
// This table has no indexes defined, so it will use the default sequential index. Indexes
// can be defined with the JetCreateIndex API.
Api.JetBeginTransaction(sesid);
Api.JetCreateTable(sesid, dbid, "table", 0, 100, out tableid);

JET_COLUMNID id;
columndef.coltyp = JET_coltyp.Binary;
columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesid, tableid, "id", columndef, null, 0, out id);

JET_COLUMNID blob;
columndef.coltyp = JET_coltyp.LongBinary;
//columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesid, tableid, "blob", columndef, null, 0, out blob);

string indexDef = "+id\0\0";
Api.JetCreateIndex(sesid, tableid, "primary", CreateIndexGrbit.IndexPrimary, indexDef, indexDef.Length, 100);
//Api.JetSetCurrentIndex(sesid, tableid, null);
Api.JetCommitTransaction(sesid, CommitTransactionGrbit.LazyFlush);

long Process_MemoryStart = 0;
Process MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Console.WriteLine("Before loop : " + Process_MemoryStart / 1024 + "KB");

int i = 0;
for (int t = 0; t < 20; t++)
{
Api.JetBeginTransaction(sesid);
for (int j = 0; j < 500; j++)
{
i = t * 500 + j;
string dataString = techcrunchString + i.ToString();

byte[] data = Encoding.UTF8.GetBytes(dataString);
string keyString = i.ToString();
byte[] key = Encoding.UTF8.GetBytes(keyString);

//store
Api.MakeKey(sesid, tableid, key, MakeKeyGrbit.NewKey);
bool exists = Api.TrySeek(sesid, tableid, SeekGrbit.SeekEQ);

if (exists)
{
Api.JetPrepareUpdate(sesid, tableid, JET_prep.ReplaceNoLock);
//Console.WriteLine("store: " + "update");
}
else
{
Api.JetPrepareUpdate(sesid, tableid, JET_prep.Insert);
Api.SetColumn(sesid, tableid, id, key);
//Console.WriteLine("store: " + "insert");
}
Api.SetColumn(sesid, tableid, blob, data);
Api.JetUpdate(sesid, tableid);

if (i % 500 == 0)
{
long Process_MemoryStart1 = 0;
Process MyProcess1 = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart1 = MyProcess1.PrivateMemorySize64;
Console.WriteLine("Finished " + i.ToString() + " : " + Process_MemoryStart1 / 1024 + "KB");

}

}
Api.JetCommitTransaction(sesid, CommitTransactionGrbit.None);


}
Process_MemoryStart = 0;
MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Console.WriteLine("Loop finished: " + Process_MemoryStart / 1024 + "KB");

// Terminate ESENT. This performs a clean shutdown.
Api.JetCloseTable(sesid, tableid);
Process_MemoryStart = 0;
MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Console.WriteLine("After close table: " + Process_MemoryStart / 1024 + "KB");

Api.JetEndSession(sesid, EndSessionGrbit.None);
Process_MemoryStart = 0;
MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Console.WriteLine("After end session: " + Process_MemoryStart / 1024 + "KB");

Api.JetTerm(instance);

Process_MemoryStart = 0;
MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Console.WriteLine("After term instance: " + Process_MemoryStart / 1024 + "KB");
}

在上面的代码中,它上升到大约 100 MB。 只有当我执行 Api.JetTerm(instance) 时,内存才会被释放

在我的实际问题中,我必须不断插入大量数据行很多次,所以这种方式对我来说行不通,因为内存最终会被耗尽。

谁能帮我解决这个问题?

**为什么即使我提交了交易,esent 仍保留内存?

我怀疑是保存内存的 esent 中的撤消操作,如果是,如何将其关闭?我不需要撤消操作。**

谢谢

P.S:我在 32 位和 64 位 Windows 中都尝试过这个 test() 方法,两者都有相同的内存问题。

最佳答案

这会有帮助吗:http://www.nikosbaxevanis.com/bonus-bits/2010/10/adventures-using-rhino-servicebus.html

Microsoft.Isam.Esent.Interop.JET_param, CacheSizeMax This parameter configures the maximum size of the database page cache. The size is in database pages. If this parameter is left to its default value, then the maximum size of the cache will be set to the size of physical memory when JetInit is called.

Setting the Microsoft.Isam.Esent.Interop.SystemParameters.CacheSizeMax to 1024 or 512 seems to solve the problem with the increasing memory usage.

关于C# - ESENT 数据库内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7797450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com