2016-10-25 2 views
0

없이 목록의 제품을 교차하는 방법이 내 코드에서 OutOfMemory

def main(args: Array[String]): Unit = { 
    genSomeThing.grouped(100).grouped(1000) 
    // save to MongoDB 
    } 

    def genSomeThing: Stream[String] = { 
    for { 
     a <- ('A' to 'Z').toStream 
     b <- ('0' to '9').toStream 
     c <- ('A' to 'Z').toStream 
     d <- ('0' to '9').toStream 
     e <- ('A' to 'Z').toStream 
     f <- ('A' to 'Z').toStream 
    } yield s"$a$b$c$d$e$f" 
    } 

내가, 내가를 초과 예외 에 OutofMemory 자바 힙 공간 또는 GC 제한을받을 MongoDB를 (100 COL 1000 기록)에 대량 삽입을 예외없이 MongoDB를에 저장하는 방법을

이 내가 원하는 결과 문자열을 따르려고 노력 해낸 것입니다

답변

1

(나는 스트림하지만 쓸모 반복자로 변경하고 같은 예외를 얻을).

class dataStr extends Iterator[String] { 
    private val itr: Iterator[BigInt] = Iterator.iterate(0:BigInt)(_ + 1) 

    override def hasNext = true 
    override def next = { 
    val na = itr.next ; val ca: Char = ('A' + na%26).toChar 
    val nb = na/26 ; val cb: Char = ('A' + nb%26).toChar 
    val nc = nb/26 ; val cc: Char = ('0' + nc%10).toChar 
    val nd = nc/10 ; val cd: Char = ('A' + nd%26).toChar 
    val ne = nd/26 ; val ce: Char = ('0' + ne%10).toChar 
    val nf = ne/10 ; val cf: Char = ('A' + nf%26).toChar 
    s"$cf$ce$cd$cc$cb$ca" 
    } 
} 

여기에서 필요에 따라 그룹화하고 삽입 할 수 있습니다.

val ds = new dataStr 
ds.next      // res0: String = A0A0AA 
ds.grouped(100).grouped(1000) // res1: GroupedIterator[Seq[String]] = non-empty iterator 
ds.next      // res2: String = A0O7YF 
+0

출력이 올바르지 않습니다. 최종 출력은 Z5 ...하지만 최종 출력은 Z9Z9ZZ이며 올바른 것으로 만듭니다. 이 코드 => [genSomeThing] (https://gist.github.com/veerapatyok/19f94fa4b6dcea9c80522a87f18e0371) 고맙습니다. –

+0

@VeerapatBoonvanich, 버그를 지적 해 주셔서 감사합니다. 내 게시물이 수정되었습니다. 나는 당신의 솔루션이 적당하지만 불필요하게 장황 함을 느낀다. – jwvh