我有两组 HProf 转储,一组用于大样本,另一组用于较小样本 - 两者都是我拥有的大量数据的非常小的样本的结果。我试图找出我方法中的瓶颈。
这是我的大( http://pastebin.com/PEH8yR3v)和小样本(http://pastebin.com/aR8ywkDH )的堆分配数据。
我注意到 char[] 是占用我大部分内存的那个。此外,char[] 占用的内存百分比从小样本运行到大样本运行不等。我不知道当我分析我的整个样本时它会如何变化。
但是,我关心的重要问题是 - 当我尝试运行一个 3GB 大小的输入数据(它写回 10GB 数据)时,使用这个程序(READ、PARSE/PROCESS、WRITE)。除了大小不超过 1GB 的列表外,我不会在内存中存储任何内容 - 这是普通的读取、处理、写入管道。鉴于此,我的程序在运行时仍需要大约 7GB 的主内存。
这是我的做法,
read a file in from a string Iterator
for each line in ip_file perform
op_buffer = myFunction(line)
write op_buffer to op_file.
Perform this for all 20K files in my input data.
def myFunction(line)
{
var :String = null;
for each word in line
{
var class_obj = new Classname(word)
op_line + = class_obj.result
}
return op_line
}
由于在 myFunction 中创建的对象将在 myFunction 结束时超出范围,因此我不会注意删除/释放它们。各位有没有感觉到瓶颈?