2012-11-03 15 views
13

Pisałem parser następująco:Scala parser syntezatora, duży plik problem

class LogParser extends JavaTokenParsers { 

    def invertedIndex: Parser[Array[Array[(Int, Int)]]] = { 
    num ~> num ~> num ~> rep(postingsList) ^^ { 
     _.toArray 
    } 
    } 

    def postingsList: Parser[Array[(Int, Int)]] = { 
    num ~> rep(entry) ^^ { 
     _.toArray 
    } 
    } 

    def entry = { 
    num ~ "," ~ num ^^ { 
     case docID ~ "," ~ count => (docID.toInt, count.toInt) 
    } 
    } 

    def num = wholeNumber ^^ (_.toInt) 

} 

Gdybym analizować z (270MB) plik z FileReader następująco:

val index = parseAll(invertedIndex, new FileReader("path/to/file")).get 

Dostaję Exception in thread "main" java.lang.StackOverflowError (próbowałem również owijania w BufferedReader), ale można to naprawić przez pierwsze czytanie pliku w ciąg tak:

val input = io.Source.fromFile("path/to/file") 
val str = input.mkString 
input.close() 
val index = parseAll(invertedIndex, str).get 

Dlaczego tak się dzieje? Czy istnieje sposób, aby najpierw nie czytać jako String, wydaje się być marnotrawstwem?

+2

Jaki jest aktualny rozmiar stosie, a ile większe masz zrobić swój stack, aby uniknąć StackOverflowException? Ile mniejszy musi być stos, aby przepełnić wersję String? (Możesz ustawić swój stos na 16 MB, uruchamiając się w następujący sposób: 'scala -J-Xss16M') – DaoWen

+0

Używałem tylko domyślnego rozmiaru stosu, ale kiedy ustawiłem go na 16M, program nadal działał 30 minut później ... – Robert

+1

To może być związany z błędem Scala 2.9.2 [SI-6520] (https://issues.scala-lang.org/browse/SI-6520). –

Odpowiedz