Używanie scala Dodałem około 100000 węzłów do połączonej listy. Kiedy używam funkcji length, na przykład mylist.length. Otrzymuję błąd "java.lang.StackOverflowError", czy moja lista jest duża do przetworzenia? Lista jest tylko obiektami typu string.Scala lista powiązana stackoverflow
Odpowiedz
Wygląda na to, że implementacja biblioteki nie jest rekursywna w trybie ogonowania override def length: Int = if (isEmpty) 0 else next.length + 1
. Wygląda na to, że jest to coś, co można omówić na liście mailingowej, aby sprawdzić, czy należy otworzyć bilet ulepszeń.
Można obliczyć długość takiego:
def length[T](l:LinkedList[T], acc:Int=0): Int =
if (l.isEmpty) acc else length(l.tail, acc + 1)
Możesz spróbować zwiększyć rozmiar stosu/sterty dostępny dla maszyny JVM.
scala JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" MyClass.scala
Gdzie
-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 ma trochę więcej informacji.
Zobacz także ten This Scala document.
Masz na myśli 'JAVA_OPTS =" - Xmx512M -Xms16M -Xss16M "scala MyClass.scala'? Moja powłoka wymaga, aby JAVA_OPTS była przed poleceniem scala. – huynhjl
W programie Scala obliczanie długości listy jest operacją n, dlatego należy jej unikać. Możesz rozważyć przełączenie na Array, ponieważ jest to ciągła operacja czasu.
"Wektor" jest lepszy niż "Tablica" –
Czy możesz potwierdzić, że naprawdę trzeba użyć metody length
? Wygląda na to, że możesz nie używać prawidłowego typu kolekcji dla twojego przypadku użycia (trudno powiedzieć bez dodatkowych informacji). Listy są zoptymalizowane do mapowania za pomocą fałd lub funkcji rekurencyjnej.
Mimo to jest to absolutnie niedopatrzenie, które można łatwo naprawić w standardowej bibliotece za pomocą funkcji rekursywnej. Mamy nadzieję, że uda nam się zdobyć ją na czas 2.9.0.
- 1. Lista "magicznych" funkcji Scala
- 2. Scala lista mecz
- 3. Scala lista warunkowa budowa
- 4. Lista i podtypy Scala
- 5. scala mutable val Lista
- 6. Powiązana lista zawierająca inne powiązane listy i bezpłatne
- 7. log4j stackoverflow
- 8. Jaka jest skala powiązana z JVM?
- 9. Lista transformacji do mapy elementu -> lista (element) w scala
- 10. Scala Lista krotki do płaskiej listy
- 11. Podział lista scala na n list przeplatania
- 12. funkcja Lista Scala grupowania kolejne elementy identyczne
- 13. Scala: Lista pary do pary list
- 14. Scala elegancka lista rozumienia jak w F #
- 15. Łącząc dwa Opcja [Lista [String]] w Scala
- 16. Scala: dlaczego nie działa lista [=> Int]?
- 17. lista zawiera Scala vs tablica zawiera
- 18. Błąd StackOverFlow na zajęciach
- 19. dlaczego kontynuacje unikają stackoverflow?
- 20. Klasyczny StackOverflow: Java Swing
- 21. wyjątek IIS StackOverflow
- 22. Błąd stackoverflow w java
- 23. Błąd StackOverflow, wyjątek View.inflate
- 24. StackOverflow w kontynuacji monady
- 25. Stackoverflow z powodu długiej linii RDD
- 26. szukaj tagów takich jak stackoverflow?
- 27. Ajax post comment like StackOverflow
- 28. Stackoverflow z implementacją Java Quicksort
- 29. Java 8 strumienie - stackoverflow wyjątek
- 30. Jak uniknąć tego wyjątku stackoverflow?
Jestem wszystkim za bilet ulepszenia. Ta metoda może być łatwo zaimplementowana w sposób nierekurencyjny, aż do "TraversableOnce". Mogę nawet zaimplementować go w tym wierszu komentarza: 'def length: Int = {var count = 0; foreach {_ => count + = 1}; count} '. Z powrotem na 'LinearSeq', można uzyskać jeszcze lepszą wydajność przy użyciu prywatnej metody pomocnika, aby oryginalna implementacja była w pełni rekurencyjna. IMHO, oba podejścia powinny zostać podjęte. Czy to otwierasz, czy mogę? –
@Daniel Otwórz to, ponieważ możesz podać więcej sugestii ode mnie, tak jak tutaj. – huynhjl
Ok. https://lampsvn.epfl.ch/trac/scala/ticket/3996 –