2

ets と dets を使用して、1 GB の XML ファイルからいくつかのデータをテーブルに抽出する必要があります。ウェブ全体とここでも検索しましたが、大きな XML ファイルの処理方法に関する簡単な例は見つかりませんでした。最初は、ファイル全体をメモリにアップロードせずにファイルを読み取る方法を理解したいだけです。

ありがとうございます。

4

4 に答える 4

3

来て !必要なのは、ErlsomというSAX XML パーサーです。小さなファイルの場合、すべてをメモリにロードしてから、この質問に対する回答のように解析することができます。しかし、あなたの場合、これらの大きなファイルには SAX メソッドが必要です。サックスの例はここにあります。SAX は、ファイルを解析するためにメモリにロードしないことを保証します。パーサーが取得するトークンは、パーサーが提供するものです。末尾再帰、パターン マッチング、ステートフル プログラミングの高度なスキルが必要です。編集




次に、erlsom をダウンロードlibし、すべての組み込みアプリケーションが配置されている場所であるerlang に展開します。抽出フォルダーの名前を次のように変更しますerlsom-1.0。という名前のファイルを作成します:Emakefileフォルダーにerlsom-1.0。これをそのファイルに入れて保存します。
{"src/*", [verbose,report,warn_obsolete_guard,{outdir, "ebin"}]}.
erlsom-1.0 フォルダーは次のようになります。
erlsom-1.0 
|-doc/
|-ebin/
|-examples/
|-include/
|-src/
|-Emakefile
他のファイルの残りは重要ではありません。ここで、フォルダーpwd()を調べている erlang シェルを開きます。erlsom-1.0関数を実行します:make:all().このように
Eshell V5.9 (^G で中止)
1>メイク:すべて()。
再コンパイル: src/ucs
再コンパイル: src/erlsom_writeHrl
再コンパイル: src/erlsom_write
再コンパイル: src/erlsom_ucs
再コンパイル: src/erlsom_simple_form
再コンパイル: src/erlsom_sax_utf8
再コンパイル: src/erlsom_sax_utf16le
再コンパイル: src/erlsom_sax_utf16be
再コンパイル: src/erlsom_sax_list
再コンパイル: src/erlsom_sax_lib
再コンパイル: src/erlsom_sax_latin1
再コンパイル: src/erlsom_sax
再コンパイル: src/erlsom_pass2
再コンパイル: src/erlsom_parseXsd
再コンパイル: src/erlsom_parse
再コンパイル: src/erlsom_lib
再コンパイル: src/erlsom_compile
再コンパイル: src/erlsom_add
再コンパイル: src/erlsom
最新の
2>
それで、それは終わりました。そのため、フォルダーerlsom-1.0が erlanglibにある場合は、どの erlang シェルからでも erlsom メソッドを呼び出すことができpwd()ます。

于 2012-07-30T08:33:03.993 に答える
0

xmerl ライブラリを確認しましたか?

于 2012-07-29T14:31:18.477 に答える
0

大きなファイルを読み込み、完全にメモリにロードしない場合は、file:open/2を次のように使用できます。

 {ok, FileHandler} = file:open(File, [read, raw, read_ahead]),
 {ok, Line} = file:read_line(FileHandler)

また、XML を操作するために、Erlang には xmerl がありますが、残念ながら、これは文書化されていません。

于 2012-07-30T07:27:46.773 に答える
-1

Erlangはわかりませんが、Cライブラリを統合することは可能のようです。あなたがその道を進んで進んでいくなら、私はあなたがexpatライブラリを見ていることをお勧めします. これは、私が知っている高速で軽量な xml パーサー ライブラリです。シンプルなコールバック メカニズムが各 xml 要素のコードを呼び出し、それをメモリに保持するかスキップするかを自分で決定できます。

私は知っています、これは非常に低レベルです。しかし、非常に大きなデータの場合、悲しいことに、多くの場合、これが唯一の方法です。

これは私がグーグルで見つけたものです:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html

于 2012-07-29T14:21:06.083 に答える