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
これはなぜですか?最初に文字列として読み込まないようにする方法はありますか?それは無駄に思えますか?
を、現在のあなたのスタックのサイズ、およびどのくらいの大きなあなたがStackOverflowExceptionがを避けるために、あなたのスタックをしなければならないとは何ですか? Stringバージョンのオーバーフローを防ぐには、スタックのサイズはどれくらい小さくする必要がありますか? (あなたは 'scala -J-Xss16M'のように起動してスタックを16MBに設定できます) – DaoWen
私はちょうどデフォルトのスタックサイズを使っていましたが、16Mに設定するとプログラムは30分後に実行されていました... – Robert
Scala 2.9.2バグ[SI-6520](https://issues.scala-lang.org/browse/SI-6520)に関連する可能性があります。 –