我有两组HProf转储,一组用于大样本,另一组用于较小的样本--这两组都来自于我所拥有的巨大数据的一个非常小的样本。我在努力找出我的方法中的瓶颈。
以下是我的大样本(http://pastebin.com/PEH8yR3v)和小样本(http://pastebin.com/aR8ywkDH)的堆分配数据。
我注意到,char[]占用了我的memory.Also的大部分时间-- char[]占用的内存百分比从小到大不等。我不知道当我分析我的整个样本时会有什么变化。
但是,我关心的重要问题是,当我试图运行一个大小为3GB的输入数据时,这个程序(读取、解析/处理、写入)会写回10 3GB的数据。除了大小不超过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的末尾显示出来,所以我不小心删除/释放它们。你们感觉到瓶颈了吗?
发布于 2013-11-09 20:07:01
因为,在myFunction中创建的对象将在myFunction的末尾显示出来。
不,他们不会的。这不是C++。所有对象都是在堆上创建的,并且一直存在直到垃圾回收。
而且,您还没有在伪代码中声明op_line,所以我假设它是在方法调用之间保留的,我猜这是内存泄漏。我的意思是,不可能有一个由>1亿字节组成的字符数组,这正是“小”堆转储所表示的。
https://stackoverflow.com/questions/19882336
复制相似问题