Android OutOfMemory问题

Android OutOfMemory问题,android,sql,memory,out-of-memory,Android,Sql,Memory,Out Of Memory,我正在解析设备上的二进制文件,并将我关心的字段存储在数组中。这些文件可以生成大小为100000的数组。当然,java告诉我内存不足(我认为android只允许每个应用程序有16MB的内存) 是否有其他方法获取这些数据 基本上,我解析点和颜色信息,将其存储在数组中,然后使用vertexBuffers在OpenGL中绘制它们。将它们存储在数据库中对我没有帮助,是吗 谢谢大家! 编辑: 我对一个有482000个点的文件进行了解析。它存储位置和颜色而不会崩溃。我在调试器中看到了这一点: Grow hea

我正在解析设备上的二进制文件,并将我关心的字段存储在数组中。这些文件可以生成大小为100000的数组。当然,java告诉我内存不足(我认为android只允许每个应用程序有16MB的内存)

是否有其他方法获取这些数据

基本上,我解析点和颜色信息,将其存储在数组中,然后使用vertexBuffers在OpenGL中绘制它们。将它们存储在数据库中对我没有帮助,是吗

谢谢大家!

编辑: 我对一个有482000个点的文件进行了解析。它存储位置和颜色而不会崩溃。我在调试器中看到了这一点:

Grow heap (frag case) to 43.164MB for 23156032-byte allocation
Forcing collection of SoftReferences for 30874704-byte allocation
Out of memory on a 30874704-byte allocation
错误在
java.nio.ByteBuffer.allocateDirect
我已将该代码区域包括在下面:

//Parse file and populate arrays
PointParser(fileName, header);

// a float is 4 bytes, therefore we multiply the number if 
// vertices with 4.
ByteBuffer vbb = ByteBuffer.allocateDirect(lasVertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(lasVertices);
vertexBuffer.position(0);   

ByteBuffer cbb = ByteBuffer.allocateDirect(lasColors.length * 4);
cbb.order(ByteOrder.nativeOrder());
colorBuffer = cbb.asFloatBuffer();
colorBuffer.put(lasColors);
colorBuffer.position(0);    


我不知道它是否能帮助你,但是这里有很多来自谷歌关于内存管理的交互建议:

我不知道它是否能帮助你,但是这里有很多来自谷歌关于内存管理的交互建议:

@Francesco我有几个浮点数数组。我希望以某种方式使用一个数据库,但我不知道我是否可以用OpenGL顶点绘制来实现……你需要一次加载所有的数据库吗?如果你不是一次性绘制100000多个点,那么为什么不分解你正在做的事情,只创建/加载/处理你当时需要的东西呢?@Poldie我正在处理一个特殊的3D点云。我对android上OpenGL ES的理解是,你将一个数组指向一个顶点缓冲区,然后它从那里绘制它。我不知道如何动态交换数据,以便绘制所有数据。。。这有意义吗谢谢。在OpenGL中,没有理由不能执行多个调用。例如,在100次呼叫中,每次都绘制1000个点。但16MB应该足以容纳100000个点。100000*3(x,y)*4(每点字节数)比一兆兆多一点。内存不足是什么时候发生的?它是在文件读取过程中还是在渲染过程中发生的?@Francesco我有几个浮点数数组。我希望以某种方式使用一个数据库,但我不知道我是否可以用OpenGL顶点绘制来实现……你需要一次加载所有的数据库吗?如果你不是一次性绘制100000多个点,那么为什么不分解你正在做的事情,只创建/加载/处理你当时需要的东西呢?@Poldie我正在处理一个特殊的3D点云。我对android上OpenGL ES的理解是,你将一个数组指向一个顶点缓冲区,然后它从那里绘制它。我不知道如何动态交换数据,以便绘制所有数据。。。这有意义吗谢谢。在OpenGL中,没有理由不能执行多个调用。例如,在100次呼叫中,每次都绘制1000个点。但16MB应该足以容纳100000个点。100000*3(x,y)*4(每点字节数)比一兆兆多一点。内存不足是什么时候发生的?它是在文件读取期间还是在渲染例程期间发生的?
public void draw(GL10 gl) {
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glPointSize(0.6f);
        gl.glDrawArrays(GL10.GL_POINTS, 0, numVertices);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }