Java OutOfMemory durante la clasificación

PashaMinigun:

Tengo una tarea sobre la construcción de una pirámide usando lista de números, pero hay un problema con una de las pruebas. En mi tarea que necesito para ordenar una lista. Yo uso Collections.sort ():

Collections.sort(inputNumbers, (o1, o2) -> {
            if (o1 != null && o2 != null) {
                return o1.compareTo(o2);
            } else {
                throw new CannotBuildPyramidException("Unable to build a pyramid");
            }
        });

Pero esta prueba falla

@Test(expected = CannotBuildPyramidException.class)
    public void buildPyramid8() {
        // given
            List<Integer> input = Collections.nCopies(Integer.MAX_VALUE - 1, 0);

        // run
        int[][] pyramid = pyramidBuilder.buildPyramid(input);

        // assert (exception)
    }

con OutOfMemoryError en lugar de mi propia CannotBuildPyramidException (que será lanzada en otro método después de la clasificación). Yo entiendo que es a causa de TimSort en el método Collections.sort (). He intentado utilizar HeapSort, pero yo no podía `elementos de intercambio incluso porque mi lista de entrada se inicializa como Arrays.asList () y cuando uso conjunto () método consigo UnsupportedOperationException. Luego trató de convertir a mi lista ArrayList común

ArrayList<Integer> list = new ArrayList<>(inputNumbers);

pero tengo OutOfMemoryError nuevo. Ya no está permitido a las pruebas de edición. No sé qué hacer con este problema. Im usando Java8 y IntelliJ IDEA SDK

Desbordamiento del montón:

Tenga en cuenta que la lista creada por Collections.nCopies(Integer.MAX_VALUE - 1, 0)usos de una pequeña cantidad de memoria y es inmutable . La documentación dice "Devuelve una lista inmutable que consiste en N copias del objeto especificado. El objeto de datos recién asignada es pequeña (que contiene una sola referencia al objeto de datos)" . Y si nos fijamos en la aplicación , verá que hace exactamente lo que cabría esperar de esa descripción. Devuelve un Listobjeto que sólo finge ser grande, que sólo cuenten con el tamaño y el elemento de una vez y devolver ese elemento cuando se le preguntó acerca de cualquier índice.

El problema con Collections.sortes luego dos veces:

Así que hay que encontrar alguna otra manera de ordenar. Uno que trabaja en el lugar y no lo hace nada de intercambio para esta entrada (lo cual es correcto, ya que la lista ya está ordenada). Usted podría, por ejemplo, el uso ordenamiento de burbuja, que toma tiempo O (n) y O (1) espacio en esta entrada y no intenta ninguna permutas aquí.

Por cierto, acerca de cómo obtener el problema de memoria "debido a TimSort" : Timsort no es realmente el culpable. Ni siquiera llegar a la parte Timsort, ya que es la matriz copia a preparatoria que causa el problema de memoria. Y además, Timsort es inteligente y podría detectar que los datos ya está ordenada y luego no hacer nada. Así que si realmente hizo llegar a la parte Timsort, o si se puede aplicar directamente a la lista, Timsort no causaría un problema.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=444540&siteId=1
Recomendado
Clasificación