私は初心者のスクレーパーであり、プログラミングの経験は全くありません。Pythonで大容量のxmlファイルを解析しようとしています - メモリエラー
私は、Canopy環境でPythonを使用してダウンロードしたXMLファイルをいくつか掻き集め、xml.domパーサを使用しています。私は単に最初からの書誌特許出願番号からタグを削り取ろうとしています(これは私が[0]を使っている理由です)、私はどのようにデータセット全体を解析して保存したいのか見ています;一度にすべてを行うのではなく、 XMLからの抜粋は以下のようになります。コードが完全に走った後
from xml.dom import minidom
filename = "C:/Users/SMOLENSK/Documents/Inventor Research/xml_2009/ipg091229.xml"
f = open(filename, 'r')
doc = f.read()
f.close()
xmldata = '<root>' + doc + '</root>'
data = minidom.parse(xmldata)
US_Biblio = xmldata.getElementsByTagName("us-bibliographic-data-grant")[0]
pat_num = US_Biblio.getElementsByTagName("doc-number")[0]
dates = pat_num.getElementsByTagName("date")
for date in dates:
print(date)
は、今私はメモリエラーのためにいくつかのメッセージを得ているが、それだけでされています:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.2 2006-08-23" file="USD0606726-20091229.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20091214" date-publ="20091229">
<us-bibliographic-data-grant>
<publication-reference>
<document-id>
<country>US</country>
<doc-number>D0606726</doc-number>
<kind>S1</kind>
<date>20091229</date>
</document-id>
</publication-reference>
<application-reference appl-type="design">
<document-id>
<country>US</country>
<doc-number>29299001</doc-number>
<date>20071217</date>
私のコードは、これまでのところ、このようになります。残念ながら、私は正確に何が起こったかを書き留めることができませんでした。データの負荷が高いため(このファイルだけでも、460万行になる)、毎回ほとんどの操作がクラッシュし、エラーを再現することができません。
コードに間違いがありますか?私のコードは、各タグ名の格納を開始する前に、データセット全体を解析していますが、特定の量だけを解析する方法はありますか?おそらく、最初のセットで新しいxmlファイルを作成するだけです。
あなたが迷っているなら、私は私が事前になっていた
ExpatError: junk after line xxx
の問題を回避するために使用。私は私のコーディングスキルが驚くべきではないことを知っているので、うまくいけば、私は単純で嫌なプログラミングエラーを作らなかった。
あなたは ''タグを追加するために、ファイル全体を複製しています。 'minidom.parse'は' file'オブジェクトをとります。 'with'と' data = minidom.parse(f) 'を使ってリキャストしてみてください。 –
ちょっと、マイク。私が「xmldata」について何を意味しているのか理解していますが、私は「 ''と再使用する」方法がわかりません。あなたは偶然の事例を明確にするのに役立つでしょうか? – HelloToEarth
... [大規模なXMLファイルのためにPython Iterparseを使う](https://stackoverflow.com/q/7171140/2823755)...おそらくlxmlを試してみてください。また、minidomnには、未使用のものを解放するのに役立つ[unlink](https://docs.python.org/3/library/xml.dom.minidom.html#xml.dom.minidom.Node.unlink)メソッドがあります。検索を絞り込んで新しい割り当てを行うたびに(例えば、 '' 'US_Biblio = ...' ''、前の変数を削除しようとすると(例えば( '' 'del data' '')) – wwii