堆栈
#This function will be matching error lines from error repo files and if matched it will yank those lines from the files.
def MatchandYankerrors():
ferrorrepo = errorrepopath
conclufile = os.path.join(Decompressfilepath,(appservername+'conclusion'))
ferrorfile = open(ferrorrepo)
output = []
for errlines in ferrorfile: #Pick each line from error_dict
c = 0
newerrliens = errlines.strip() # error_dict file each line strip and spilit
#confile = open(conclufile,"r+")#This will keep opening file every time when we need new error to search.
#confilelines = confile.readlines() #This will read all lines from file.
#confile.seek(0)
i=0
for line in fileinput.input(conclufile,inplace=1,backup='.orig'):
line = line.strip()
if newerrliens in line:
pass
else:
print line
fileinput.close()
堆
very fast access
don't have to explicitly de-allocate variables
space is managed efficiently by CPU, memory will not become fragmented
limit on stack size (OS-dependent)
答案 0 :(得分:2)
我将从堆栈的堆/缺点的优点开始:
<强> 1。分配顺序独立释放:这是您问题的最重要答案。如果只有基于堆栈的内存,则无法立即释放e内存区域,除非它立即位于堆栈顶部。但是,对于堆,无论分配请求的顺序如何,都可以释放内存。与在动态软件中一样,您无法在软件的整个生命周期中了解免费请求的顺序,这就是您不总是希望使用堆栈内存的原因。
<强> 2。确定系统范围的堆栈大小:另一个相关点是,如果只使用堆栈内存,则意味着系统中的所有线程都将具有固定内存。在这种情况下,确定理想的默认线程堆栈大小并不容易。这会导致内存过度消耗。因此,即使实际上没有足够的内存,这也可能导致内存不足。关于这一个,我建议看看这个:http://linuxtips.manki.in/2011/11/tweaking-stack-size-of-linux-processes.html
堆栈式堆分配器可能有用的区域:游戏引擎采用这种技术。一个很好的例子是加载和卸载资源(纹理,着色器,三维网格等) 在加载水平并卸载它。像分配器这样的堆栈是一种自然的解决方案,因为卸载资产的顺序与加载它们相反。在这里,您可以看到实施:https://github.com/davidaug/stackallocator
堆积的其他问题:您还可以将这些问题视为堆栈的更多优点,作为您在问题中提到的专业人员的补充:
a)多核系统:关于堆栈分配器的另一个优点是,由于来自不同CPU核心的分配请求是堆分配器设计需要解决的重要问题,因此锁争用会少得多。作为锁争用的补充,您还必须处理错误共享等问题。关于这一个,您可以查看http://www.drdobbs.com/parallel/understanding-and-avoiding-memory-issues/212400410
b)碎片:我提到的第一个项目(分配订单独立释放)是必须要求。但是,这也带来了碎片问题:What is memory fragmentation?