Почему for {i <- (1 to 1000000000)} println(i)
дает мне OutOfMemoryError, но (1 to 1000000000) foreach println
нет? Что делать, если я должен использовать синтаксис for-loop, что мне делать?Scala for-loop range OutOfMemoryError
ответ
Два фрагмента почти эквивалентны. for
синтаксис в scala разыгрывается компилятором в приложениях foreach
, flatmap
, withFilter
, а также map
(если вы используете yield
). Эту информацию можно найти в разделе 6.19 раздела scala language specification.
Это означает, что цикл for
for (i <- 1 to 1000000000) println(i)
становится обессахаренная в
(1 to 1000000000).foreach { case i => println(i) }
, который почти эквивалентен
(1 to 1000000000) foreach println
Ни один из фрагментов должен вызвать OutOfMemoryError. Вы можете посмотреть на перегруженном определении foreach
для Range
с в источниках:
https://github.com/scala/scala/blob/v2.10.1/src/library/scala/collection/immutable/Range.scala#L135
Существует только один индекс переменный, который мутировал в то время как цикл обработки.
Но полезно подтвердить, что нет дополнительного бокса/распаковки индекса int. Как выясняется, не существует, хотя трассировки стека, чтобы получить там немного отличается для двух форм:
Predef$.println(Object) line: 287
ForTest$$anonfun$f$1.apply$mcVI$sp(Int) line: 5
Range.foreach$mVc$sp(Function1) line: 141
ForTest$.f() line: 5
Predef$.println(Object) line: 287
ForTest$$anonfun$g$1.apply(Object) line: 6
ForTest$$anonfun$g$1.apply(Object) line: 6 // boxing here
Function1$class.apply$mcVI$sp(Function1, Int) line: 39
AbstractFunction1.apply$mcVI$sp(Int) line: 12
Range.foreach$mVc$sp(Function1) line: 141
ForTest$.g() line: 6
- 1. Scala Range конструкторами APIs
- 2. OutOfMemoryError в Scala и Спарк
- 3. Scala. Сложный анализатор выражений. OutOfMemoryError
- 4. поток вызывает OutOfMemoryError в Scala
- 5. scala range split отсутствует последний
- 6. Почему параллельные коллекции Scala иногда вызывают OutOfMemoryError?
- 7. Scala: Mutable vs. Immutable Object Performance - OutOfMemoryError
- 8. В чем причина OutOfMemoryError в Scala?
- 9. Python ForLoop синтаксис
- 10. Перестановленные Range в Scala является Одд
- 11. scala range precision for float step
- 12. Нужна помощь с использованием ForLoop внутри ForLoop
- 13. Простой forloop - Python
- 14. Forloop путаница
- 15. OutOfMemoryError
- 16. OutOfMemoryError при оценке 2D-потока
- 17. elasticsearch date range range
- 18. HighCharts stacked range range
- 19. forloop в латинском переводчике python
- 20. Рассеивание решения головоломки python forloop
- 21. ForLoop/Array Issue
- 22. forloop внутри dplyr mutate
- 23. Оптимизация Excel для ForLoop
- 24. DalekJS - ForLoop внутри теста
- 25. Разный результат в forloop?
- 26. Строительство массива в forloop
- 27. Forloop error codeigniter
- 28. Json Data Forloop Issue
- 29. Вход для Python ForLoop
- 30. forloop приращение не понимая
для цикла выделяет 10^9 Интс – pathikrit
Какая версия Скале это связано? –