我有多个功能调用在一个链中的下一个,在处理相当大的数据集,以同样大组不同的数据:如何释放先前堆栈帧的存储器中的Javascript
function first_step(input_data, second_step_callback)
{
result = ... // do some processing
second_step_callback(result, third_step);
}
function second_step(intermediate_data, third_step_callback)
{
result = ... // do some processing
third_step_callback(result);
}
function third_step(intermediate_data) { }
first_step(huge_data, second_step);
在third_step
内存不足(当内存使用量达到大约1.5 GB时,Chrome似乎杀死了该选项卡)。
我认为,当达到third_step()
时,input_data
从first_step()
仍然保留,因为first_step()
是在调用栈上,不是吗?至少在调试器运行时,我可以看到数据。
显然我不需要它了。在first_step()
之后second_step_callback(result, third_step);
之后没有代码。也许如果我可以释放内存,我的选项卡可能在处理这种大小的数据集时仍然存在。我可以这样做吗?
1.5千兆字节比客户端代码中的*“相当大”*要多得多,你可以肯定你没有无限循环 – adeneo
它在处理300 MB输入文件时发生(https:// github.com/AndreKR/XdebugFlamechartConverter)和似乎合理的内存使用情况。我无法真正把它分解成大块,因为在某些时候我必须把整棵树留在记忆中。这就是为什么我想在继续处理树进入下一步之前丢弃原始数据的原因。 – AndreKR