ets と dets を使用して、1 GB の XML ファイルからいくつかのデータをテーブルに抽出する必要があります。ウェブ全体とここでも検索しましたが、大きな XML ファイルの処理方法に関する簡単な例は見つかりませんでした。最初は、ファイル全体をメモリにアップロードせずにファイルを読み取る方法を理解したいだけです。
ありがとうございます。
ets と dets を使用して、1 GB の XML ファイルからいくつかのデータをテーブルに抽出する必要があります。ウェブ全体とここでも検索しましたが、大きな XML ファイルの処理方法に関する簡単な例は見つかりませんでした。最初は、ファイル全体をメモリにアップロードせずにファイルを読み取る方法を理解したいだけです。
ありがとうございます。
来て !必要なのは、ErlsomというSAX XML パーサーです。小さなファイルの場合、すべてをメモリにロードしてから、この質問に対する回答のように解析することができます。しかし、あなたの場合、これらの大きなファイルには SAX メソッドが必要です。サックスの例はここにあります。SAX は、ファイルを解析するためにメモリにロードしないことを保証します。パーサーが取得するトークンは、パーサーが提供するものです。末尾再帰、パターン マッチング、ステートフル プログラミングの高度なスキルが必要です。編集
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()
ます。
xmerl ライブラリを確認しましたか?
大きなファイルを読み込み、完全にメモリにロードしない場合は、file:open/2を次のように使用できます。
{ok, FileHandler} = file:open(File, [read, raw, read_ahead]),
{ok, Line} = file:read_line(FileHandler)
また、XML を操作するために、Erlang には xmerl がありますが、残念ながら、これは文書化されていません。
Erlangはわかりませんが、Cライブラリを統合することは可能のようです。あなたがその道を進んで進んでいくなら、私はあなたがexpatライブラリを見ていることをお勧めします. これは、私が知っている高速で軽量な xml パーサー ライブラリです。シンプルなコールバック メカニズムが各 xml 要素のコードを呼び出し、それをメモリに保持するかスキップするかを自分で決定できます。
私は知っています、これは非常に低レベルです。しかし、非常に大きなデータの場合、悲しいことに、多くの場合、これが唯一の方法です。
これは私がグーグルで見つけたものです:http://dudefrommangalore.blogspot.de/2009/04/erlang-xml-parser-comparison.html