我创build了ac#应用程序,占用了150MB的内存(专用字节),主要是由于一个大字典: Dictionary<string, int> Txns = new Dictionary<string, int>(); 我想知道如何释放这个内存。 我试过这个: Txns = null; GC.Collect(); 但是,我的私人字节似乎并没有太大的影响 – 从155mb降到145mb。 任何线索? 谢谢 -编辑- 好吧,我有这个代码更多的运气(它获得私人字节下降到50MB),但为什么? Txns.Clear(); // <- makes all the difference Txns = null; GC.Collect(); -编辑- 对于那些说'不要使用GC.collect'的人来说,没关系(我不打算讨论这个问题,除了说你可以看到我的C背景通过),但是它并没有真正回答我的问题:为什么垃圾收集器只有在清除事务列表时才释放内存? 不pipe怎样,它不应该释放内存,因为字典已经取消了?
我正在编写一个应用程序,它将运行多个线程,并希望限制这些线程的CPU /内存使用量。 对于C ++有一个类似的问题 ,但是我想尽量避免使用C ++和JNI。 我意识到这可能不会使用更高级别的语言,但我很好奇,看看有没有人有任何想法。 编辑:增加了一个赏金; 我想要一些非常好的,深思熟虑的想法。 编辑2:我需要这个的情况是在我的服务器上执行其他人的代码。 基本上它是完全的任意代码,唯一的保证就是在类文件上会有一个主要的方法。 目前,在运行时加载的多个完全不同的类正在作为单独的线程同时执行。 写它的方式,重构为每个被执行的类创build单独的进程将是一个痛苦。 如果这是通过VM参数来限制内存使用的唯一好方法,那就这样吧。 但是我想知道是否有办法用线程来完成。 即使作为一个单独的过程,我想能够以某种方式限制其CPU使用率,因为如前所述,其中几个将立即执行。 我不想要一个无限循环来占用所有的资源。 编辑3:一个简单的方法来近似对象的大小是与java的Instrumentation类; 具体来说就是getObjectSize方法。 请注意,使用此工具需要一些特殊设置。
诸如“ps”和“top”之类的工具报告各种内存使用情况,例如VM大小和驻留集大小。 但是,这些都不是“真正”的内存使用情况: 程序代码在同一程序的多个实例之间共享。 共享库程序代码在使用该库的所有进程之间共享。 一些应用程序分离进程并与他们共享内存(例如通过共享内存段)。 虚拟内存系统使VM大小报告几乎没有用处。 当一个进程被换出时RSS是0,使得它不是很有用。 等等 我发现Linux报告的私人脏RSS是最接近“真实”内存使用情况的。 这可以通过将/proc/somepid/smaps所有Private_Dirty值相加来获得。 但是,其他操作系统是否提供了类似的function? 如果不是,还有什么select? 特别是,我对FreeBSD和OS X感兴趣。
我做了一些奇怪的观察,发现我的GridSearches在几个小时后仍然失败,我最初不知道为什么。 我随着时间的推移对内存使用情况进行了监控,并看到它以几千兆字节(〜6 Gb)开始并持续增长,直到达到最大值时才崩溃。 128 GB的硬件可以采取。 我正在试验随机森林分类大量的文本文件。 为了简单起见 – 弄清楚发生了什么 – 我回到了朴素的贝叶斯。 我正在使用的版本是 Python 3.4.2 scikit-learn 0.15.2 我在GitHub的scikit-issue列表上发现了一些关于这个主题的讨论: https : //github.com/scikit-learn/scikit-learn/issues/565和https://github.com/scikit-learn/scikit -learn /拉/ 770 这听起来像是已经成功解决了! 所以,我正在使用的相关代码是 grid_search = GridSearchCV(pipeline, parameters, n_jobs=1, # cv=5, scoring='roc_auc', verbose=2, pre_dispatch='2*n_jobs', refit=False) # tried both True and False grid_search.fit(X_train, y_train) print('Best score: {0}'.format(grid_search.best_score_)) print('Best parameters set:') 出于好奇,我后来决定通过嵌套for循环来实现网格search的快速和肮脏的方式 for p1 in parameterset1: […]
我们的WCF服务显示了大量内存使用的实例,所以我们花了一个完整的内存转储来确定问题。 Operating System Windows Server 2008 R2Service Pack 1 Number Of Processors 4 Process Image c:\Windows\System32\inetsrv\w3wp.exe System Up-Time 40 day(s) 09:23:09 Process Up-Time 14 day(s) 11:49:01 .NET 4.0 Processor Type X64 Process Bitness 64-Bit 从DebugDiag报告的问题的直升机视图。 进程是垃圾收集,所以根据警告我不应该信任!heap命令的所有输出。 Gc堆:1.37 GBytes .NETcaching大小为750Mb, 虚拟内存详细信息:虚拟分配:17.45 Gb加载模块:208.68 Mb线程数:25 Mb本地堆积:3.06 Gb(我很关心这个) 从上面的3.02 Gb出现在Heap 0x003f0000 。 我们有很好的stream量,这样1.3 gb Gb的堆大小感觉对我来说是正常的。 此外,我们有32 gb RAM和64位地址空间的机器,所以caching大小750 mb是可以接受的。 […]
在我目前的一个项目中,我正在阅读一些文字,看三字组的频率。 在我第一次使用它的时候,我使用了三层深度的默认字典。 换句话说, topDict[word1][word2][word3]返回这些单词在文本中出现的次数, topDict[word1][word2]返回一个字典,其中所有单词出现在单词1和2之后。 这function正常,但它是非常内存密集型的。 在我最初的testing中,它使用了像存储三元组的文本文件20倍的内存,这似乎是一个过多的内存开销。 我的怀疑是,这些字典中的许多字段的创build数量比实际使用的字段多,所以我想用这种方式replace字典中更有记忆效率的其他字典。 我强烈希望有一个解决scheme,允许沿着字典的关键查找。 从我所了解的数据结构来看,使用类似红黑或AVL的平衡二叉search树可能是理想的,但我真的不希望自己实现它们。 如果可能的话,我宁愿坚持使用标准的Python库,但如果他们能够最好地工作,我绝对可以接受其他的select。 那么,有没有人对我有任何build议? 编辑添加: 感谢迄今的回应。 到目前为止,答案中的一些已经build议使用元组,当我将前两个单词压缩成元组时,这些元组并没有太多的用处。 我不愿意把这三个字作为一个关键字,因为我希望能够容易地查看前两个字的所有第三个字。 (即我想要的东西像topDict[word1, word2].keys() )的结果。 我正在玩的当前数据集是维基百科学校的最新版本。 例如,parsing第一千页的结果对于文本文件是11MB,其中每行是三个词并且所有的tab都是分开的。 以字典格式存储文本我现在使用大约185MB。 我知道指针和额外的开销会有一些额外的开销,但差异似乎过大。
我必须编写一个Windows服务来处理某些机密数据(如PIN码,密码等)。 这些信息需要很短的时间:通常它们几乎立即被发送到智能卡读卡器。 让我们考虑这段代码: { std::string password = getPassword(); // Get the password from the user writePasswordToSmartCard(password); // Okay, here we don't need password anymore. // We set it all to '\0' so it doesn't stay in memory. std::fill(password.begin(), password.end(), '\0'); } 现在我关心的是编译器优化。 在这里编译器可能会检测到密码即将被删除,并且在这一点上改变它的值是无用的,只需要删除这个呼叫。 我不希望我的编译器关心未来未被引用的内存的价值。 我的担心是否合法? 我怎样才能确定这样一段代码不会被优化?
我之前有这个工作: echo ini_get("memory_limit")."\n"; ini_set("memory_limit","256M"); echo ini_get("memory_limit")."\n"; 这将input这个: 32M 256M 在命令行执行的PHP脚本。 我从5.2更新到5.3,从现在开始,这个指令根本不起作用:这给了我: 32M 32M 然后让我的脚本失败,一个致命的错误… 我检查了php文档,并将其search到,并且我没有发现任何“memory_limit”已被废弃的地方。 有没有人有办法解决吗?
我在使用var_dump()和输出缓冲来捕获variables并显示它们的应用程序中使用了一个debugging帮助。 但是,我遇到了一个大对象的问题,最终在缓冲区中占用了太多的内存。 function getFormattedOutput(mixed $var) { if (isTooLarge($var)) { return 'Too large! Abort!'; // What a solution *might* look like } ob_start(); var_dump($var); // Fatal error: Allowed memory size of 536870912 bytes exhausted $data = ob_get_clean(); // Return the nicely-formated data to use later return $data } 有没有办法阻止这种情况? 还是解决方法来检测它即将输出一个特定variables的巨大数量的信息? 我真的不能控制哪些variables被传入这个函数。 它可以是任何types。
简单,可能是愚蠢的问题:假设我有一个Java服务器,它在内存中存储常用的键和值,我可以查询(比如说在一个HashMap中) 这和使用Memcache(甚至Redis)有什么区别? 他们都把东西存储在内存中。 是否有一个好处? Memcache会减less内存占用量吗? 可以存储更less的内存? 更快地查询? 没有不同?