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?
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
Używałem tylko domyślnego rozmiaru stosu, ale kiedy ustawiłem go na 16M, program nadal działał 30 minut później ... – Robert
To może być związany z błędem Scala 2.9.2 [SI-6520] (https://issues.scala-lang.org/browse/SI-6520). –