En utilisant scala j'ai ajouté environ 100000 nœuds à une liste chaînée. Quand j'utilise la longueur de la fonction, par exemple mylist.length. Je reçois une erreur 'java.lang.StackOverflowError', ma liste est-elle trop grande pour être traitée? La liste est uniquement des objets chaîne.Scala liste liée stackoverflow
Répondre
Il semble que l'implémentation de la bibliothèque ne soit pas récursive en arrière override def length: Int = if (isEmpty) 0 else next.length + 1
. Il semble que ce soit quelque chose qui pourrait être discuté sur la liste de diffusion pour vérifier si un ticket d'amélioration devrait être ouvert.
Vous pouvez calculer la longueur comme ceci:
def length[T](l:LinkedList[T], acc:Int=0): Int =
if (l.isEmpty) acc else length(l.tail, acc + 1)
Vous pouvez essayer d'augmenter la taille de pile/segment disponible pour la machine virtuelle Java.
scala JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" MyClass.scala
Où
-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 a un peu plus d'informations.
Voir aussi This Scala document.
Vous voulez dire 'JAVA_OPTS =" - Xmx512M -Xms16M -Xss16M "scala MyClass.scala'? Mon shell nécessite que JAVA_OPTS soit avant la commande scala. – huynhjl
En Scala, le calcul de la longueur d'une liste est une opération de commande n, par conséquent, vous devriez essayer de l'éviter. Vous pourriez envisager de passer à un tableau, car il s'agit d'une opération à temps constant.
'Vector' est préférable à' Array' –
Pouvez-vous confirmer que vous avez vraiment besoin d'utiliser la méthode length
? Il semble que vous n'utilisiez pas le type de collection correct pour votre cas d'utilisation (difficile à dire sans aucune information supplémentaire). Les listes sont optimisées pour être mappées à l'aide de plis ou d'une fonction récursive. En dépit de cela, c'est absolument un oubli qui peut facilement être résolu dans la bibliothèque standard avec une fonction récursive de la queue. Espérons que nous pouvons l'obtenir à temps pour 2.9.0.
- 1. Liste Recherche() StackOverflow Erreur
- 2. Tags liste dans stackoverflow
- 3. Enregistrement d'une liste liée
- 4. Liste liée Récursion
- 5. Liste liée d'intervalles
- 6. C++ liste liée
- 7. Liste liée - Erreur
- 8. Présentation d'une liste liée
- 9. Liste liée n'imprimant pas la liste
- 10. Impression de liste liée Java
- 11. C++ liste liée accidentellement statique
- 12. Liste d'annotations Scala?
- 13. compilateur Scala ne reconnaît pas une vue liée
- 14. imbriqué Liste d'annotations dans Scala
- 15. Répétition d'une liste dans Scala
- 16. WPF/DeferRefresh avec la liste déroulante liée
- 17. Liste générique liée pour Delphi 2009
- 18. Liste liée. Insérer des entiers dans l'ordre
- 19. Remplir un tableau dans une liste liée?
- 20. Problèmes avec la liste liée en C
- 21. Liste liée: Cette solution est-elle bonne?
- 22. WPF databinding à une liste liée
- 23. Exemple de liste liée utilisant des threads
- 24. Liste liée affichant différentes valeurs à cout
- 25. C++ liste liée détruire la fonction
- 26. Lance une liste liée d'exceptions en Java
- 27. Comment trier une liste liée en SQL?
- 28. Faute de segmentation de liste liée C++
- 29. Liste déroulante Liée Modifie le premier élément de la liste
- 30. idiome commun en Java Scala, traverse/Itérer liste Java dans la liste Scala
Je suis tout pour un billet d'amélioration. Cette méthode peut être facilement implémentée de manière non récursive dans 'TraversableOnce'. Je peux même l'implémenter dans cette ligne de commentaire: 'def longueur: Int = {var count = 0; foreach {_ => compter + = 1}; compte} '. De retour sur 'LinearSeq', on peut obtenir des performances encore meilleures en utilisant une méthode d'aide privée pour rendre l'implémentation originale complètement récursive. À mon humble avis, les deux approches devraient être prises. L'ouvrez-vous, ou puis-je? –
@Daniel S'il vous plaît ouvrez-le, car vous pouvez fournir plus de suggestions que moi, comme vous l'avez fait ici. – huynhjl
Ok. https://lampsvn.epfl.ch/trac/scala/ticket/3996 –