9

私は巨大なxmlファイル(40 gbs)を持っています。ファイル全体をメモリにロードせずに、そこからいくつかのフィールドを抽出したいと思います。助言がありますか?

4

3 に答える 3

22

SAXParserのチュートリアルに基づくXMLEventReaderの簡単な例(Rinat Tainovによる投稿)

私はそれがより良くできると確信していますが、基本的な使用法を示すためだけです:

import scala.io.Source
import scala.xml.pull._

object Main extends App {
  val xml = new XMLEventReader(Source.fromFile("test.xml"))

  def printText(text: String, currNode: List[String]) {
    currNode match {
      case List("firstname", "staff", "company") => println("First Name: " + text)
      case List("lastname", "staff", "company") => println("Last Name: " + text)
      case List("nickname", "staff", "company") => println("Nick Name: " + text)
      case List("salary", "staff", "company") => println("Salary: " + text)
      case _ => ()
    }
  }

  def parse(xml: XMLEventReader) {
    def loop(currNode: List[String]) {
      if (xml.hasNext) {
        xml.next match {
          case EvElemStart(_, label, _, _) =>
            println("Start element: " + label)
            loop(label :: currNode)
          case EvElemEnd(_, label) =>
            println("End element: " + label)
            loop(currNode.tail)
          case EvText(text) =>
            printText(text, currNode)
            loop(currNode)
          case _ => loop(currNode)
        }
      }
    }
    loop(List.empty)
  }

  parse(xml)
}
于 2012-11-02T10:46:22.010 に答える
2

ユーザーSAXParser、xml全体をメモリにロードしません。ここに良いJavaの例があり、scalaで簡単に使用できます。

于 2012-11-02T04:38:24.203 に答える
2

代替のxmlライブラリを見て満足している場合、ScalesXmlは3つの主要なプル解析アプローチを提供します。

  1. イテレータベース-次のhasNextを使用するだけで、さらに多くのアイテムを取得できます
  2. iterate関数-イテレータを提供しますが、単純なパスで識別されるツリーに使用します
  3. Iterateeベース-複数のパスの組み合わせが可能

今後の0.5バージョンの焦点は、aalto-xmlを介した非同期解析であり、追加の非ブロッキング制御オプションを可能にします。

すべての場合において、メモリ使用量とドキュメントがスケールで処理される方法の両方を制御できます。

于 2012-11-04T23:01:41.220 に答える