2012-11-03 6 views
13

次のように次のように私はパーサを書いたScalaのパーサコンビネータ、大容量ファイルの問題

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) 

} 

私は(270メガバイト)から解析する場合には、FileReaderを持つファイル:

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

私が手Exception in thread "main" java.lang.StackOverflowError(私もBufferedReaderでラッピングを試してみました)が、私は最初にそうような文字列にファイルを読み込むことによってそれを修正することができます:

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

これはなぜですか?最初に文字列として読み込まないようにする方法はありますか?それは無駄に思えますか?

+2

を、現在のあなたのスタックのサイズ、およびどのくらいの大きなあなたがStackOverflowExceptionがを避けるために、あなたのスタックをしなければならないとは何ですか? Stringバージョンのオーバーフローを防ぐには、スタックのサイズはどれくらい小さくする必要がありますか? (あなたは 'scala -J-Xss16M'のように起動してスタックを16MBに設定できます) – DaoWen

+0

私はちょうどデフォルトのスタックサイズを使っていましたが、16Mに設定するとプログラムは30分後に実行されていました... – Robert

+1

Scala 2.9.2バグ[SI-6520](https://issues.scala-lang.org/browse/SI-6520)に関連する可能性があります。 –

答えて

1

Trampoliningをサポートするscalaパーサーコンビネータとよく似ている、スタックオーバーフローエラーを止めるために必要なライブラリ[1]があります。

[1] https://github.com/djspiewak/gll-combinators

関連する問題