2016-08-19 4 views
1

私はメモリ上の問題があり、メモリが足りないファイルを解析するのが最善の方法だろうと思います。今、私はこれを持っています、イテレータ[String]Iterator [String]を解析するためのReaderインスタンスに変換する方法はありますか?

val myIterator: Iterator[String] = io.Source.fromURL("http://somewebsite.com/download/bigFile.txt").getLines().filter(isValidInput) 

私はそれを解析したいと思います。

val result = MyParser.parseAll(MyParser.line, ???) 

それはjava.io.Readerを必要とし、私はすでにStringReaderを試してみましたが、それは私のコンピュータを殺します。イテレータをリーダーに変換する方法はありますか?

私はまた、以下のことを試みましたが、解析後の結果は0です。私は何か間違っていると思います。

import java.io.{BufferedReader, InputStreamReader} 
import scala.collection.JavaConverters._ 

val stream: InputStream = new SequenceInputStream({ 
    val i = myIterator map { s => new ByteArrayInputStream(s.getBytes("UTF-8")) } 
    i.asJavaEnumeration 
}) 
val in = new BufferedReader(new InputStreamReader(stream)) 

val result = MyParser.parseAll(MyParser.line, in) 
+0

'新しいInputStreamReaderの(新しいURL( "のhttp:// ...").openStream)を取得するために' – Dima

+0

は私が消費Iteratorは私のコードのどこかにあるので、それは私の2番目の問題を解析してみました。それは解析しようとしますが、私のコンピュータはそれを行っている間にフリーズします。それはおそらく問題の解決策でもありません。 – User1232187

+0

@Dima私は解析する前にいくつかのフィルタリングを行います。これは、不要な行をすべて削除し、パーサーをあまり複雑にしないようにするためです。 List [String]またはIterator [String]からInputStreamReader、BufferedReaderなどを作成する方法はありますか? – User1232187

答えて

0

あなたはスカラで提供PagedSeqReader、使用して試すことができます:Scalaの構文解析・コンビネータライブラリーで解析するとためにバックトラックを、ランダムアクセスを必要とするかもしれないこと

import scala.util.parsing.input.PagedSeqReader 
import scala.collection.immutable.PagedSeq 

MyParser.parseAll(
    MyParser.line, 
    new PagedSeqReader(PagedSeq.fromLines(myIterator))) 

注意を。 PagedSeqがこれをどのくらいうまく処理しているかわかりません。バックトラッキングをしないパーサを使用していても、最終的にはIterator全体をメモリにロードしようとしません。その場合、あなたがしようとしていることをすることは不可能かもしれません。

0

あなたのパーサが一度に1行を解析することができた場合は、操作を行います。myIterator map { l => MyParser.parseAll(MyParser.line, l) }Iterator[ParserResult[X]]

関連する問題