Uso de scala He agregado aproximadamente 100000 nodos a una lista vinculada. Cuando uso la longitud de la función, por ejemplo mylist.length. Aparece un error 'java.lang.StackOverflowError', ¿mi lista es grande para procesar? La lista es solo objetos de cadena.Lista enlazada de Scala stackoverflow
Respuesta
Parece que la implementación de la biblioteca no es recursiva override def length: Int = if (isEmpty) 0 else next.length + 1
. Parece que esto es algo que podría discutirse en la lista de correo para verificar si se debe abrir un ticket de mejora.
Puede calcular la longitud de esta manera:
def length[T](l:LinkedList[T], acc:Int=0): Int =
if (l.isEmpty) acc else length(l.tail, acc + 1)
Puede intentar aumentar el tamaño de pila/montón disponible para la JVM.
scala JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" MyClass.scala
Dónde
-Xss<size> maximum native stack size for any thread
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
This question tiene algo más de información.
Vea también este This Scala document.
Quieres decir 'JAVA_OPTS =" - Xmx512M -Xms16M -Xss16M "scala MyClass.scala'? Mi caparazón requiere que JAVA_OPTS esté antes del comando scala. – huynhjl
En Scala, calcular la longitud de una lista es una operación de orden n, por lo tanto, debe tratar de evitarla. Puede considerar cambiar a una matriz, ya que es una operación de tiempo constante.
'Vector' es preferible a' Array' –
Se puede confirmar que realmente necesita utilizar el método length
? Parece que no está utilizando el tipo de colección correcto para su caso de uso (difícil de distinguir sin información adicional). Las listas están optimizadas para ser mapeadas usando pliegues o una función recursiva de cola.
A pesar de decir esto, esto es absolutamente un descuido que se puede solucionar fácilmente en la biblioteca estándar con una función recursiva de cola. Con suerte, podemos obtenerlo a tiempo para 2.9.0.
- 1. C++ Lista enlazada comportamiento
- 2. Transmisión de lista enlazada multiproceso
- 3. tratar con gran variedad de lista enlazada
- 4. Lista enlazada de listas enlazadas en Java
- 5. Lista enlazada a Java: método de adición
- 6. netbeans 7.0 y scala resulta en stackoverflow
- 7. Lista enlazada simultánea sin cerradura en Java
- 8. lista enlazada añadir a la cola, confusión
- 9. Hacer que una lista enlazada sea segura
- 10. Lista lineal enlazada: ¿terminología válida/común?
- 11. Novato de Scala: recidiva y error de stackoverflow
- 12. Algoritmo de detección de bucle de lista enlazada
- 13. Creación de un constructor de copia de una lista enlazada
- 14. Función de partición de lista enlazada y resultados invertidos
- 15. Lista doblemente enlazada en un lenguaje de programación puramente funcional
- 16. ¿Hay una biblioteca predefinida de lista enlazada en C++?
- 17. ¿Puedo usar java.util.LinkedList para construir una lista circular/cíclica enlazada?
- 18. Lista enlazada que contiene otras listas enlazadas y gratuita
- 19. Codificando una función para copiar una lista enlazada en C++
- 20. ¿Cómo implementar una lista doblemente enlazada en PHP?
- 21. Cómo convertir lista enlazada a una matriz usando `toArray()`?
- 22. lista inversa Scala
- 23. Sin lista mutable de Scala
- 24. lista de scala coincide con
- 25. log4j stackoverflow
- 26. Lista de deseos de Scala Tools & Libraries
- 27. ¿Qué lista de cambios de scala usar?
- 28. Scala - convertir Lista de listas en una sola Lista: Lista [Lista [A]] en Lista [A]
- 29. StackOverflow mientras dígitos conteo
- 30. Excepción IIS StackOverflow
Estoy a favor de un ticket de mejora. Este método se puede implementar fácilmente de una manera no recursiva en todo el camino de regreso en 'TraversableOnce'. Incluso puedo implementarlo en esta línea de comentarios: 'def length: Int = {var count = 0; foreach {_ => count + = 1}; contar} '. De vuelta en 'LinearSeq', se puede obtener un rendimiento aún mejor mediante el uso de un método de ayuda privada para hacer que la implementación original sea completamente recursiva. En mi humilde opinión, ambos enfoques deben tomarse. ¿Lo abres, o puedo? –
@ Daniel Por favor, ábralo, ya que puede proporcionar más sugerencias que yo, al igual que lo hizo aquí. – huynhjl
Ok. https://lampsvn.epfl.ch/trac/scala/ticket/3996 –