有哪些提示可以减少.NET应用程序的内存使用量?考虑以下简单的C#程序.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Run Code Online (Sandbox Code Playgroud)
如果它只为x86编译它会好一点:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了以下程序,它执行相同但尝试在运行时初始化后修剪进程大小:
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio外部的 …
有时候你知道你的循环永远不会超过x次,其中x可以用byte或short来表示,基本上是一个小于int的数据类型.
为什么我们使用占用32位(大多数语言)的int,就像一个字节就足够只有8位.
我知道我们有32位和64位进程,所以我们可以在一次旅行中轻松获取值,但它仍然消耗更多内存.或者我在这里缺少什么?
更新:只是为了澄清.我知道速度明智没有区别.我问的是对内存消耗的影响.
我花了几分钟手动重新排序结构中的字段,以减少填充效果[1],这感觉就像几分钟太多.我的直觉是说我的时间可能更好地花在编写Perl脚本上,或者为我做这种优化.
我的问题是这是否也是多余的; 是否已经有一些我不知道的工具,或者我应该能够启用[2]打包结构的一些编译器功能?
由于需要在几种不同的体系结构中进行一致优化,因此使用的任何工具都需要能够考虑不同的结构对齐和指针大小,这个问题更加复杂.
编辑:快速澄清 - 我想要做的是重新排序源代码中的字段,以避免填充,而不是"编译"结构,而不是填充编译.
编辑#2:另一个复杂因素:根据配置,某些数据类型的大小也可能会发生变化.显而易见的是针对不同体系结构的指针和指针差异,但也有浮点类型(16,32或64位,取决于'精确性'),校验和(8位或16位取决于"速度")和一些其他不明显的东西.
[1]所讨论的结构在嵌入式设备上被实例化了数千次,因此结构的每个4字节减少可能意味着该项目的go和no-go之间的差异.
[2]可用的编译器是GCC 3.*和4.*,Visual Studio,TCC,ARM ADS 1.2,RVCT 3.*以及其他一些更加模糊的编译器.
我需要一个Python内存高效的int-int dict,它支持O(log n)时间内的以下操作:
d[k] = v # replace if present
v = d[k] # None or a negative number if not present
Run Code Online (Sandbox Code Playgroud)
我需持〜250M对,所以它确实有紧.
你碰巧知道一个合适的实现(Python 2.7)吗?
编辑删除了不可能的要求和其他废话.谢谢,Craig和Kylotan!
重新措辞.这是一个包含1M对的简单int-int字典:
>>> import random, sys
>>> from guppy import hpy
>>> h = hpy()
>>> h.setrelheap()
>>> d = {}
>>> for _ in xrange(1000000):
... d[random.randint(0, sys.maxint)] = random.randint(0, sys.maxint)
...
>>> h.heap()
Partition of a set of 1999530 objects. Total size = 49161112 bytes.
Index Count % …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个Trie但是在具有非常有限的内存容量的移动电话上.
我认为最好将整个结构存储在磁盘上,并且只在必要时才加载,因为我可以容忍一些磁盘读取.但是,经过几次尝试后,这似乎是一件非常复杂的事情.
有什么方法可以将Trie存储在磁盘上(即仅部分加载)并保持快速查找属性?
这开始是一个好主意吗?
这是一个简单的编程问题,来自于我对PHP如何在foreach循环中处理数组复制和取消设置缺乏了解.就像这样,我有一个阵列从我想要改变的外部源格式来找我.一个简单的例子是:
$myData = array('Key1' => array('value1', 'value2'));
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
$myData = array([0] => array('MyKey' => array('Key1' => array('value1', 'value2'))));
Run Code Online (Sandbox Code Playgroud)
所以我采取第一个$myData并将其格式化为第二个$myData.我的格式化算法完全没问题.我的问题在于找到一种节省内存的方法,因为这些数组可能会有点笨拙.因此,在我的foreach循环中,我将当前数组值复制到新格式,然后我从原始数组中取消设置我正在使用的值.例如:
$formattedData = array();
foreach ($myData as $key => $val) {
// do some formatting here, copy to $reformattedVal
$formattedData[] = $reformattedVal;
unset($myData[$key]);
}
Run Code Online (Sandbox Code Playgroud)
这是unset()一个好主意吗?即,它是否节省了内存,因为我复制了数据并且不再需要原始值?或者,PHP是否自动垃圾收集数据,因为我没有在任何后续代码中引用它?
代码运行正常,到目前为止,我的数据集的大小可以忽略不计,无法测试性能差异.我只是不知道我是否为自己设置了一些奇怪的错误或以后的CPU命中.
感谢您的任何见解.
-sR
我接受了缓刑求职面试(?我不确定这是不是这个词),面试官让我告诉他结构和班级之间有什么区别.
所以我告诉了我所知道的一切以及我在msdn上读过的所有内容.
那家伙说"不够",我没有任何线索.所以他说:
结构是优化的,所以如果有和整数和浮点数,它们有一些相同的咬合,那么它将保存这个空间,所以struct with
int=0和float=0size的一半int=int.MAX,float=float.MIN.
好的.所以我很喜欢 - 没听说过.
但接下来,在采访之后我正在思考它并且它对我来说并没有多大意义.这意味着,当我们改变其中某个变量的值时,结构大小会有所不同.并且它不能真正存在于内存中,如果在扩展时发生碰撞会怎么样.而且我们必须写一些我们正在滑动的位,不确定它是否会给出任何优化.
另外,他在乞讨时问我,Java中的struct和class有什么不同.我已经回答过,Java中没有结构,他说"不是程序员,而是数字类型是结构"我有点像WTF.
基本上问题是:
这个家伙知道的是什么,这很难被了解(我的意思是,我在网上寻找它,找不到东西)
或许他对自己的工作一无所知,并试图在面试时看起来很酷.
我想在a中存储大量的字符串Map<String, MagicObject>,以便MagicObjects可以快速访问.这张地图有很多条目,内存正成为瓶颈.假设MagicObjects无法优化,我可以在这种情况下使用哪种最有效的地图类型?我目前正在使用以下内容:
gnu.trove.map.hash.TCustomHashMap<byte[], MagicObject>
Run Code Online (Sandbox Code Playgroud) 我有一个关于std :: vector的问题.
我有一个非常内存密集的算法,我预测到预测矢量大小并提前为矢量保留足够的内存将帮助我减少内存使用量.
以下哪项更好:
for ( ... ) {
std::vector<Type> my_vector;
my_vector.reserve(stuff_count);
// Do stuff , and append stuff to my_vector.
}
Run Code Online (Sandbox Code Playgroud)
或这个:
std::vector my_vector;
for ( ... ) {
my_vector.clear();
my_vector.reserve(stuff_count);
// Do stuff , and append stuff to my_vector.
}
Run Code Online (Sandbox Code Playgroud)
请告诉我哪个是最好的,或者是否有更好的做事方式.
非常感谢你提前!
我有Java应用程序,它集中使用2D浮点数组(float [] []数组),实际上在黑色背景上保存图像.两个维度都是等于(正方形)并且是2的幂(大多数是256,512,1024),因此在大多数情况下,靠近边界的区域具有零.
大小等于2的功率以提高性能(存在一些FFT)并且降低了那些阵列上的操作的复杂性,例如旋转等.最近我在6Gb的机器上面临这个应用程序的堆缺乏.通过我的计算 - 这个应用程序的内存消耗应该高达2-3Gb,而它达到4-5Gb(在Windows任务管理器中查看).我使用了"YourKit"分析器,它显示那些浮点数阵列确实占用了大部分内存,但是,这些浮点数组的总粗略大小应该是1.3Gb(嗯,我知道由JVM决定如何存储数据,但是我没想到内存消耗会有2-3倍的差异.
我试图使用Snappy压缩器动态压缩/解压缩数据(并且内存消耗降至3.5Gb),但性能下降了几次,这是不可接受的.此外,我在BufferedImage替换那些浮动[] []时测试性能,但性能非常差.
因此,还有两种方法可以减少内存消耗:1)为float [] []数组写包装器以保存"零"元素(有很多"空"行和列)2 )远离"2的力量"
这两种方式都需要相当多的编码/重构,所以当我想"成为或不成为"时 - 你可能对这个问题有更好的线索,伙计们?
谢谢!