Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory TCL中的RAM存储器_Memory_Tcl - Fatal编程技术网

Memory TCL中的RAM存储器

Memory TCL中的RAM存储器,memory,tcl,Memory,Tcl,我有一个创建全局数组的代码,当我取消设置数组时,内存仍然很忙 我已经在Windows中试用了TCL 8.4和8.6 console show puts "allocating memory..." update for {set i 0} {$i < 10000} {incr i} { set a($i) $i } after 10000 puts "deallocating memory..." update foreach v [array names a] { un

我有一个创建全局数组的代码,当我取消设置数组时,内存仍然很忙

我已经在Windows中试用了TCL 8.4和8.6

console show

puts "allocating memory..."

update

for {set i 0} {$i < 10000} {incr i} {
 set a($i) $i
}

after 10000

puts "deallocating memory..."

update

foreach v [array names a] {
 unset a($v)
}

after 10000

exit
控制台显示
放入“分配内存…”
更新
对于{set i 0}{$i<10000}{incr i}{
设置一个($i)$i
}
一万以后
将“释放内存…”
更新
foreach v[数组名称a]{
取消设置a($v)
}
一万以后
出口

在许多程序中,无论是用Tcl还是其他语言编写的,过去的内存使用情况都是未来内存使用情况的一个很好的指标。因此,作为一种通用的启发式方法,Tcl的实现并不试图将内存返回给操作系统(如果需要,它总是可以将内存分页出来;操作系统总是负责)。事实上,每个线程实际上都有自己的内存池(允许内存处理在很大程度上是无锁的),但在这里,只有一个主线程(以及一些通常可以忽略的幕后工作线程)并没有多大区别。此外,内存池将趋向于过度分配,因为这样工作要快得多


无论您使用什么工具进行测量,如果它使用的是Tcl外部的工具,那么由于池的工作方式,它不会提供特别好的实际内存使用情况跟踪。Tcl的内部工具(内存
命令)提供了更准确的信息,但默认情况下没有:它们是构建Tcl库时的编译时选项,通常会关闭,因为它们有大量开销。此外,在Windows上,它们的某些功能只有在您构建控制台应用程序时才起作用(这是它们如何实现的结果)。

您所说的“内存仍然很忙”是什么意思?您测量的是什么?您对该测量的期望是什么?我的意思是,如果您多次运行上述代码,当达到计算机的最大RAM内存时,程序停止工作。我有一个与数组一起工作的程序,打算不停地工作,但事实并非如此…抱歉,更正,上面的代码是我正在使用的程序的简化。。。我的程序正在为我运行代码的每个循环中的数组创建新索引…只需执行
取消设置a
比在
数组名称上执行该循环要快得多
array names
处理一些复杂的情况,这些情况使它变得非常昂贵,而且清除这样的数组太费劲了。我正在使用Windows任务管理工具查看TCL程序消耗了多少资源。正如我之前所说,我的问题是,如果你重复上面的代码几次,就会达到计算机的最大RAM内存…对不起,更正,上面的代码是我正在使用的程序的简化。。。我的程序正在为我运行代码的每个循环中的数组创建新的索引…@DonalFellows-试图提供帮助,从18年前偶然发现了你:D(怀疑线程仍然适用…)编写并向我们展示的代码不会以描述的方式耗尽内存;一旦停止使用内存,Tcl就非常积极地重用内存。