- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我刚开始使用 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/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!