Fuera de memoria al asignar cursores

Tengo un problema de memoria que no puedo resolver. Tengo una clase que hace todo el trabajo de recuperación de mi base de datos. El error que tengo es el siguiente:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)

El error de asignación de memoria ocurre cuando hago esto:

mDatabaseInterface.getGraphForLevel(level);

Sé que es una fuga porque llamo a este método cada 2.5 segundos aproximadamente, y las 5 o 6 primeras llamadas se realizan fácilmente. Ahora aquí están los métodos en mi clase DatabaseInterface:

public Graph getGraphForLevel(Level level) {

    //get the nodes
    ArrayList<Node> nodes = new ArrayList<Node>(Arrays.asList(this.getNodesWithLevel(level)));
    //get the edges
    ArrayList<Edge> edges = new ArrayList<Edge>(Arrays.asList(this.getEdgesWithNodes(nodes)));

    return new Graph(nodes, edges);
}

public Node[] getNodesWithLevel(Level level) {

    List<Node> l = new ArrayList<Node>();

    Cursor cursor = mDatabase.query("nodes", null, 
            "level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);

    while (cursor.moveToNext()) {
        l.add(parseNodeFromCursor(cursor));
    }

    cursor.close();

    return l.toArray(new Node[l.size()]);       
}

private Node parseNodeFromCursor(Cursor cursor) {

    Level l = getLevelWithId(cursor.getInt(2));

    return new Node(cursor.getInt(0), cursor.getString(1), l, 
            cursor.getInt(4), cursor.getInt(5));
}

Tengo muchos métodos que se llaman unos a otros, pero sé que no es un problema de recursión porque esta clase funciona en otra aplicación. Mi pregunta principal es por qué nocursor.close() liberar el cursor? Si hago algo como:

cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();

¿Se retiene el cursor en ese caso?

Gracias por adelantado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta