လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ကြီးမားသော XML ဖိုင်များကိုကိုင်တွယ်ရန် XML_Parse ၏ Memory စီမံခန့်ခွဲမှုများကိုပိုမိုကောင်းမွန်အောင်ပြုလုပ်နည်း

ကြီးမားသော XML ဖိုင်များကိုကိုင်တွယ်ရန် XML_Parse ၏ Memory စီမံခန့်ခွဲမှုများကိုပိုမိုကောင်းမွန်အောင်ပြုလုပ်နည်း

M66 2025-04-25

XML ဖိုင်ကြီးများနှင့်ဆက်ဆံရာတွင် PHP မှပေးသော XML_Parse function သည် (Expat parser အပေါ်အခြေခံသည်) သည်ထိရောက်သောနည်းလမ်းဖြစ်သည်။ သို့သော်မသင့်လျော်သောမှတ်ဥာဏ်စီမံခန့်ခွဲမှုကြောင့် XML ဖိုင်များ၏ Megabytes နှင့်ရာနှင့်ချီသော megabytes များပြုလုပ်သောအခါ, ဤဆောင်းပါးသည် XML_Parse ၏မှတ်ဉာဏ်စီမံခန့်ခွဲမှုအပေါ်ရှုထောင့်မှကြည့်ရှုခြင်းမှ XML ဖိုင်၏စွမ်းဆောင်ရည်နှင့်တည်ငြိမ်မှုကိုမည်သို့တိုးတက်အောင်လုပ်ရမည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။

1 ။ ပြ problem နာနောက်ခံ

XML သည်ဘုံဒေတာဖလှယ်ပုံစံဖြစ်သည်။ အီးဖြင့်ကူးသန်းရောင်းဝယ်ရေး, ထောက်ပံ့ပို့ဆောင်ရေး, အကြောင်းအရာစုစည်းခြင်းစသည့်စနစ်များစွာကိုအသုတ်တွင်တင်သွင်းရန်သို့မဟုတ်တင်ပို့ရန်အတွက် XML ကိုမှီခိုခြင်းစသည်တို့ပါဝင်သည်။ သို့သော် PHP သည် XML ဖိုင်များကိုကြီးမားစွာခွဲခြမ်းစိတ်ဖြာသောအခါဖိုင်တစ်ခုလုံးကိုတစ်ချိန်တည်းတွင်မှတ်ဉာဏ်သို့စာဖတ်ခြင်းကိုဖတ်ပါ။

ဥပမာအားဖြင့်:

 $xml = file_get_contents('https://m66.net/data/huge.xml');
$parser = xml_parser_create();
xml_parse($parser, $xml, true);
xml_parser_free($parser);

အထက်ပါကုဒ်သည် Php.ini တွင် Memory_Limit ကို သတ်မှတ်ထားသည့်ဆာဗာပတ်ဝန်းကျင်တွင်ကွန်ပျူတာများကိုပြုပြင်သည့်အခါအထက်ပါကုဒ်များသည်မှတ်ဥာဏ်လျှံကိုအလွယ်တကူဖြစ်ပေါ်စေနိုင်သည်။

2 ။ ပိုကောင်းအောင်မဟာဗျူဟာ

1 ။ ရှင်းရှင်းလင်းလင်းဖတ်မည့်အစား streaming ကိုသုံးပါ

XML ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းဖတ်ရှုခြင်းနှင့်နှိုင်းယှဉ်လျှင် XML_Parse () နှင့်ပေါင်းစပ်ထားသော fopen () နှင့် အရူးအမူး () () နှင့်ပေါင်းစပ်ထားသော incremental parsing နည်းလမ်းကိုအသုံးပြုရန်အကြံပြုသည်။ ၎င်းသည်မှတ်ဥာဏ်အသုံးပြုမှုကိုသိသိသာသာလျှော့ချနိုင်သည်။

 $parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");

$fp = fopen("https://m66.net/data/huge.xml", "r");
while ($data = fread($fp, 4096)) {
    if (!xml_parse($parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($parser)),
            xml_get_current_line_number($parser)));
    }
}
fclose($fp);
xml_parser_free($parser);

2 ။ Callbacks အတွက်ဒေတာ stacking ရှောင်ကြဉ်ပါ

Memory Management သည်အချက်အလက်များကို callback function များဖြင့်အချက်အလက်သိုလှောင်မှုကိုဖြေရှင်းရန်လိုအပ်သည်။ XML သစ်ပင်တစ်ခုလုံးကိုမှတ်ဉာဏ်သို့မမှတ်ထားပါနှင့်, အသုံးဝင်သောသတင်းအချက်အလက်များကိုထုတ်ယူပြီးနောက်ချက်ချင်းဒေတာဘေ့စ်သို့ရေးရန်သို့မဟုတ်ရေးရန်ရွေးချယ်သင့်သည်။

 function startElement($parser, $name, $attrs) {
    if ($name === 'ITEM') {
        // သော့ချက်စာလုံးများကိုသာထုတ်ယူပါ
        global $currentItem;
        $currentItem = [];
    }
}

function endElement($parser, $name) {
    global $currentItem;
    if ($name === 'ITEM') {
        // အပြောင်းအလဲနဲ့ပြီးနောက်ချက်ချင်းသန့်ရှင်းရေး
        processItem($currentItem);
        unset($currentItem);
    }
}

function processItem($item) {
    // နမူနာ:ချက်ချင်းဒေတာဘေ့စ်သို့မဟုတ် output ကိုရေးပါ
    file_put_contents('/tmp/items.txt', json_encode($item) . PHP_EOL, FILE_APPEND);
}

3 ။ ကျိုးကြောင်းဆီလျော်သောမှတ်ဉာဏ်ကန့်သတ်ချက်များနှင့်အချိန်ကုန်များကိုသတ်မှတ်ပါ

ဇာတ်လမ်းမှတ်ဉာဏ်ကန့်သတ်ချက်နှင့်ကွပ်မျက်မှုအချိန်သည်လုပ်ငန်းစဉ်အတွင်းကြားဖြတ်နှောင့်ယှက်မှုများမှရှောင်ရှားရန်ကုဒ်မှတဆင့် code မှတဆင့် code မှတဆင့်ပိုမိုမြင့်မားနိုင်ပါသည်:

 ini_set('memory_limit', '512M');
set_time_limit(0);

သို့သော်ဤအချက်သည်ပြ the နာအတွက်အခြေခံကျသောအဖြေမဟုတ်ကြောင်း ကျေးဇူးပြု. မှတ်သားပါ, ၎င်းသည်ဖိုင်အနည်းငယ်ပိုကြီးသည့်အခြေအနေများနှင့်သက်ဆိုင်သည်။ သို့သော်ဖွဲ့စည်းပုံသည်ကျိုးကြောင်းဆီလျော်သည်။

3 ။ အပိုဆောင်း optimization အကြံပြုချက်များ

  • SAX parsing mode ကိုအသုံးပြုခြင်း - XML ​​parser ကိုယ်တိုင်ကဖြစ်ရပ်မှန်ကိုမောင်းနှင်ခြင်း, ဒါကိုအားသာချက်ယူပြီးဒီအားသာချက်ကိုယူပြီးအခွင့်ကောင်းယူပြီးမှတ်ဉာဏ်ကိုချွေတာခြင်းကိုရှောင်ရှားနိုင်သည်။

  • Sharding processing + breakpoint စဉ်ဆက်မပြတ်စာဖတ်ခြင်း - သီးခြား XML ဖိုင်များအတွက် (ပစ္စည်းတစ်ခုစီသည်လွတ်လပ်သော data item item item item) အတွက်သင်၏အခြေအနေကိုသိမ်းထားနိုင်သည်။

  • အချက်အလက်များကိုလုပ်ဆောင်ရန်အတွက်မီးစက်ထုတ်လုပ်ရန် PHP Generator ( အထွက်နှုန်း ) ကို XML callocating forctions များဖြင့်အသုံးပြုနိုင်သည်။

4 ။ အကျဉ်းချုပ်

XML ဖိုင်များကိုပြုပြင်ခြင်း၏အဓိကအချက်မှာ "ဖိုင်အပြည့်အစုံ" နှင့် "အချက်အလက်အပြည့်အစုံကိုသိုလှောင်ခြင်းမှရှောင်ရှားရန်ဖြစ်သည်။ XML_Parse သည် စာဖတ်ခြင်း, လက်ငင်းအချက်အလက်ပြုပြင်ခြင်းနှင့်မှတ်ဉာဏ်အထွတ်အထိပ်ထိန်းချုပ်မှုနှင့်ပေါင်းစပ်ခြင်းဖြင့်ပေါင်းစပ်ထားသော XML parsing ဖြေရှင်းချက်ကိုကျွန်ုပ်တို့ရရှိနိုင်ပါသည်။

၎င်းသည်တစ်ခုတည်းခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်သင့်လျော်သည်သာမကပုံမှန်သွင်းကုန်လိုအပ်သည့်နောက်ခံအလုပ်အခြေအနေများအတွက်လည်းဖြစ်သည်။ ဤဆောင်းပါးတွင် optimization အတွေးအခေါ်များသည်သင့်အား XML ဖိုင်များကိုအလွယ်တကူကိုင်တွယ်နိုင်ရန်ကူညီနိုင်သည်ဟုကျွန်ုပ်မျှော်လင့်ပါသည်။