0xA*_*xAX 5 scala list append range out-of-memory
我是Scala语言的新手.
我需要Range for Long类型.
我需要一个[1,2,3 ... 10000000]列表和步骤1.如果我使用直到/我因为使用Long而不是Int而得到错误.
我尝试编写一个简单的函数,它需要一个开始,一个结束和一个空List,并生成一个[start .. end]列表.
这是我的功能:
def range_l(start : Long, end : Long, list : List[Long]) : List[Long] = {
if (start == end){
val add_to_list = start :: list
return add_to_list
}
else {
val add_to_list = start :: list
range_l(start + 1, end, add_to_list)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它:range_l(1L, 1000000L, List())我OutOfMemory在以下行中得到错误:add_to_list = start :: list
你能给我什么建议?我怎样才能获得Range[Long]或如何优化功能.我怎样才能避免OutOfMemory?
谢谢.
par*_*tic 12
您可以使用以下语法创建此类范围:
val range = 1L to 10000000L
Run Code Online (Sandbox Code Playgroud)
'L'必须通知编译器litterals是longs而不是int.
然后,您可以List在实例上使用几乎所有方法range.它不应该填满你的内存,因为中间值是在需要时生成的.范围可以传递给任何期望a Traversable[Long],a Seq[Long],an Iterable[Long]等的方法.
但是,如果你真的需要一个List只是调用range.toList(并增加堆大小以容纳所有列表元素)...
你可能不需要一个范围.我会采用Stream并迭代它.
def stream(i: Long = 1): Stream[Long] = i #:: stream(i + 1)
Run Code Online (Sandbox Code Playgroud)
产生一个无限流,其中元素之间的差异是1.因为Stream是一个惰性集合,所以你不会得到任何错误.要迭代超过10000000个元素,您只需使用以下内容:
val range = stream take 10000000
for (i <- range) {
...
}
Run Code Online (Sandbox Code Playgroud)
take 10000000将返回一个Stream大小为10000000.因为Stream是一个Iterable你可以传递给一个comprehansion.
您可以使用标准库中的NumericRange [Long].