xml_find_all()を使用しようとすると、read_xml()は大きなファイルを正常に読み込みますが、私は「エラー:メモリ割り当てに失敗しました:ノードセットのヒット限界が増えています。私はこの制限がおそらくXPATH_MAX_NODESET_LENGTH varのlibxml2内に設定されていると仮定していますか?多分これはxml2パッケージ自体の問題ではないかもしれません。しかし、xml2には解決策がありますか?ノードを取り除き、運がないままメモリを解放することを実験しました。ありがとう。メモリ割り当ての取得に失敗しました:xml2パッケージでノードセットのヒットリミットが増加しています
1
A
答えて
3
はい、libxml2 XPathエンジンのハードコードされたノードセットの制限に達しています。 からxpath.c:
/*
* XPATH_MAX_NODESET_LENGTH:
* when evaluating an XPath expression nodesets are created and we
* arbitrary limit the maximum length of those node set. 10000000 is
* an insanely large value which should never be reached under normal
* circumstances, one would first need to construct an in memory tree
* with more than 10 millions nodes.
*/
#define XPATH_MAX_NODESET_LENGTH 10000000
1つのオプションは、別の値でlibxml2のを再コンパイルすることです。または、XPM式を変更して、10Mノードを超えるノードセットに遭遇しないようにすることもできます。この制限は、式の評価中に作成される中間ノードセットにも適用されます。だから、残念ながら、述語とノードセットを分割することは動作しません。
//element[position() < 5000000]
//element[position() >= 5000000 and position() < 10000000]
//element[position() >= 10000000 and position() < 15000000]
本質的には、すべてのNodeTest以上10Mのノードを返さないことを確認する必要があります。あなたがそれをすることができないなら、あなたは悲しいかなか幸運ではありません。
libxml2 mailing listでこの問題を提起することもできます。この制限は、DoS攻撃につながる可能性のある悪意のあるXPath式から保護するために導入されたものだと思います。しかし、私が見ているように、式は入力文書に存在するノードより多くのノードを返すことはできません。とにかく、ノードセットに使用されるメモリの最大量は、入力ドキュメントのサイズによって制限されます。
関連する問題
- 1. メモリの割り当てに失敗しました:バッファの増加 - Python
- 2. nodejs v8メモリのGC割り当てに失敗しました
- 3. メモリの割り当てに失敗しました
- 4. dma_alloc_coherent()メモリ割り当てに失敗しました(4MB以上)
- 5. 割り当てに失敗しました - プロセスをメモリ
- 6. メモリ割り当てプロファイリング中にメモリ割り当てが増加し続ける
- 7. Rails/Mysql2/Lion [FATAL]がメモリの割り当てに失敗しました
- 8. RuntimeError:CorrMMが作業メモリ576 x 50176の割り当てに失敗しました
- 9. neo4jによる 'Java heap space'エラー - メモリ割り当ての増加が失敗した場合
- 10. 4096 kbのカーソルウィンドウ割り当てが失敗しました
- 11. セグメンテーションが割り当て中に失敗しています
- 12. php -ssh2_exec ptyの割り当てに失敗しました
- 13. Swiftの変数割り当てに失敗しました
- 14. 2048 kbのカーソルウィンドウ割り当てに失敗しました
- 15. 割り当てが失敗しました
- 16. 十分なメモリがありますが、mmapが失敗してメモリが割り当てられません。
- 17. Node.js "致命的なエラー:JS割り当てが失敗しました - メモリが足りなくなりました" - スタックトレースを取得できますか?
- 18. iPhone - メモリ割り当てがやや増えています
- 19. PCLリリースビルドがクラッシュして割り当てに失敗しました
- 20. ノードの構築中にメモリ割り当てが失敗する
- 21. Rails:ワーカーが失敗してメモリ使用量が増加する
- 22. SQL Serverがクエリを実行するのに十分なメモリ割り当てに失敗しました
- 23. シェフを使用したJenkinsの展開プロジェクトエラー:NoMemoryError:メモリの割り当てに失敗しました
- 24. Android 4.0.3エミュレータがクラッシュする:メモリの割り当てに失敗しました:8
- 25. ASP.NET MVC 3でのjQuery Mobileのテーマ割り当てに失敗しました
- 26. ビットマップを使用して割り当てに失敗しました -
- 27. Bundler: "Gemネイティブエクステンションの作成に失敗しました"、 "メモリを割り当てられません"
- 28. メモリの割り当てに失敗する
- 29. パッケージ内のアイコンの取得に失敗しました
- 30. gitolite:チャネル0でPTY割り当て要求が失敗しました
ありがとうございました。代わりに、SAXインターフェイスを使ってイベントを解析する方法があります(これは、RのXMLライブラリのxmlEventParse関数を使用する方法を見ることができます)。read_xmlではxml2パッケージを使用して同じことが達成できるかどうかはわかりません関数は "SAX1"を値として受け入れる "options"引数を含んでいます...。TBD – litlogger
@litlogger * read_xml *を使用してXPathを使わずにドキュメントツリーを歩くことも可能です。 xmlTextReader *](http://www.xmlsoft.org/html/libxml-xmlreader.html)がRバインディングによって公開されている場合は、最もメモリ効率の良いアプローチです。 – nwellnhof