ホームページ バックエンド開発 Python チュートリアル Python を使用して大規模な XML データを解析するためのヒント

Python を使用して大規模な XML データを解析するためのヒント

Aug 07, 2023 pm 03:55 PM
XMLパーサー データ解析 ビッグデータ処理

Python を使用して大規模な XML データを解析するためのヒント

Python を使用して大規模な XML データを解析するためのテクニックとコード例

1. はじめに
XML (Extensible Markup Language) は、ストレージおよび送信 自己記述型で拡張可能なデータ用のマークアップ言語。大規模な XML ファイルを処理する場合、効率を向上させ、メモリ使用量を削減するために、多くの場合、特定のテクニックとツールが必要になります。この記事では、Python で大規模な XML データを解析するための一般的な手法をいくつか紹介し、対応するコード例を示します。

2. SAX パーサーを使用する
Python の組み込みモジュール xml.sax を使用して、イベント駆動型の方法で XML データを解析します。 DOM (Document Object Model) パーサーと比較して、大規模な XML ファイルを処理する場合、SAX (Simple API for XML) パーサーには明らかな利点があります。ファイル全体をメモリにロードする必要はありませんが、XML ファイル構造に従ってデータを 1 行ずつ読み取り、特定のイベント (開始タグ、終了タグ、文字データなど) が発生すると、対応するコールバック関数をトリガーして処理します。 、など)。

以下は、SAX パーサーを使用して大規模な XML データを解析するサンプル コードです。

import xml.sax

class MyContentHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.current_element = ""
        self.current_data = ""
    
    def startElement(self, name, attrs):
        self.current_element = name
    
    def characters(self, content):
        if self.current_element == "name":
            self.current_data = content
    
    def endElement(self, name):
        if name == "name":
            print(self.current_data)
            self.current_data = ""

parser = xml.sax.make_parser()
handler = MyContentHandler()
parser.setContentHandler(handler)
parser.parse("large.xml")
ログイン後にコピー

上記のコードでは、xml.sax を継承するプロセッサ クラスをカスタマイズしました。 ContentHandler MyContentHandler。 startElement、characters、endElement などのコールバック関数では、実際のニーズに応じて XML データを処理します。この例では、name 要素のデータのみに注目し、それを出力します。

3. lxml ライブラリを使用して XML データを解析する
lxml は、XML データと HTML データを処理するための効率的な API を提供する強力な Python ライブラリです。 XPath (XML ノードを選択するための言語) と組み合わせることで、XML データを簡単に抽出および操作できます。大規模な XML データを処理する場合、多くの場合、lxml は組み込みの xml モジュールよりも効率的です。

以下は、lxml ライブラリを使用して大規模な XML データを解析するサンプル コードです:

import lxml.etree as et

def process_xml_element(element):
    name = element.find("name").text
    print(name)

context = et.iterparse("large.xml", events=("end", "start"))
_, root = next(context)
for event, element in context:
    if event == "end" and element.tag == "entry":
        process_xml_element(element)
        root.clear()
ログイン後にコピー

上記のコードでは、lxml.etree モジュールの iterparse 関数を使用して解析します。 XML データを 1 行ずつ表示します。 events パラメーターを ("end", "start") として指定すると、各 XML 要素の最初と最後で対応する処理ロジックを実行できます。サンプルコードでは、entry要素の解析時にprocess_xml_element関数を呼び出してname要素のデータを処理しています。

4. 大規模な XML データをチャンクに分けて解析する
大規模な XML データを処理する場合、解析のためにファイル全体を一度にメモリにロードすると、過剰なメモリ使用量が発生し、プログラムの崩壊を引き起こします。一般的な解決策は、XML ファイルを小さなチャンクに分割して解析することです。

次は、大規模な XML データをチャンクに分けて解析するためのサンプル コードです:

import xml.etree.ElementTree as et

def process_xml_chunk(chunk):
    root = et.fromstringlist(chunk)
    for element in root.iter("entry"):
        name = element.find("name").text
        print(name)

chunk_size = 100000
with open("large.xml", "r") as f:
    while True:
        chunk = "".join(next(f) for _ in range(chunk_size))
        if chunk:
            process_xml_chunk(chunk)
        else:
            break
ログイン後にコピー

上記のコードでは、XML ファイルを 100,000 行を含む小さなチャンクに分割し、ブロックします。解析されたXMLデータ。 process_xml_chunk 関数では、xml.etree.ElementTree モジュールの fromstringlist 関数を使用して文字列チャンクを Element オブジェクトに変換し、必要に応じてデータ処理を実行します。

5. プロセス プールを使用して XML データを並列解析する
大規模な XML データの解析効率をさらに向上させたい場合は、Python のマルチプロセッシング モジュールを使用して複数のプロセスを使用して XML を解析することを検討できます。ファイルを並行して実行します。

以下は、プロセス プールを使用して大規模な XML データを並列解析するサンプル コードです。

import xml.etree.ElementTree as et
from multiprocessing import Pool

def parse_xml_chunk(chunk):
    root = et.fromstringlist(chunk)
    entries = root.findall("entry")
    return [entry.find("name").text for entry in entries]

def process_xml_data(data):
    with Pool() as pool:
        results = pool.map(parse_xml_chunk, data)
    for result in results:
        for name in result:
            print(name)

chunk_size = 100000
data = []
with open("large.xml", "r") as f:
    while True:
        chunk = [next(f) for _ in range(chunk_size)]
        if chunk:
            data.append(chunk)
        else:
            break

process_xml_data(data)
ログイン後にコピー

上記のコードでは、「parse_xml_chunk」関数が複数のプロセスに渡されます。並列実行と各プロセスは、小さな XML データの解析を担当します。解析が完了すると、メインプロセスは結果をマージして出力します。

6. 概要
この記事では、Python を使用して大規模な XML データを解析するための一般的な手法をいくつか紹介し、対応するコード例を示します。 SAX パーサー、lxml ライブラリ、チャンク解析、プロセス プール並列処理などの方法を使用することにより、大規模な XML データの解析の効率とパフォーマンスを向上させることができます。実際のアプリケーションでは、実際のニーズに応じて適切な方法を選択することで、XML データ処理の課題にうまく対処できます。

以上がPython を使用して大規模な XML データを解析するためのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles