आप स्ट्रीमिंग पार्सर का उपयोग करना चाहेंगे। ये एक बार में आपकी फ़ाइल के केवल छोटे हिस्से को ही मेमोरी में खींच लेते हैं।
वे दो अलग-अलग स्वादों में आते हैं:सैक्स-जैसे पुश पार्सर्स, और पुल पार्सर्स। XML रीडर मॉडल:SAX बनाम XML पुल पार्सर अंतर का अवलोकन देता है।
पुश पार्सर
यह साल्सीफाई/जेसन-स्ट्रीमिंग-पार्सर का उपयोग करने का एक त्वरित उदाहरण है।
जैसे ही यह फ़ाइल के माध्यम से आगे बढ़ता है हम summonerId
. का ट्रैक रखेंगे , championId
, और राज्य। यह सब घटना-आधारित है - आपको अनुक्रमिक पार्सर के साथ यादृच्छिक पहुंच नहीं मिलती है, इसलिए आपको स्वयं चीजों का ट्रैक रखना होगा। हर बार एक totalSessionsPlayed
ऊपर आता है यह summonerId . को प्रतिध्वनित करेगा , championId , और कुल सत्र चलाए गए ।
data.json
यह प्रदर्शन उद्देश्यों के लिए युग्मित-डाउन जसन फ़ाइल है।
[
{
"_id": "53b29644aafd413977b23b7e",
"summonerId": 24570940,
"region": "euw",
"stats": {
"110": {
"totalSessionsPlayed": 3,
"totalSessionsLost": 2,
"totalSessionsWon": 1
},
"112": {
"totalSessionsPlayed": 45,
"totalSessionsLost": 2,
"totalSessionsWon": 1
}
}
},
{
"_id": "asdfasdfasdf",
"summonerId": 555555,
"region": "euw",
"stats": {
"42": {
"totalSessionsPlayed": 65,
"totalSessionsLost": 2,
"totalSessionsWon": 1
},
"88": {
"totalSessionsPlayed": 99,
"totalSessionsLost": 2,
"totalSessionsWon": 1
}
}
}
]
उदाहरण:
class ListMatchUps extends JsonStreamingParser\Listener\IdleListener
{
private $key;
private $summonerId;
private $championId;
private $inStats;
public function start_document()
{
$this->key = null;
$this->summonerId = null;
$this->championId = null;
$this->inStats = false;
}
public function start_object()
{
if ($this->key === 'stats') {
$this->inStats = true;
} else if ($this->inStats) {
$this->championId = $this->key;
}
}
public function end_object()
{
if ($this->championId !== null) {
$this->championId = null;
} else if ($this->inStats) {
$this->inStats = false;
} else {
$this->summonerId = null;
}
}
public function key($key)
{
$this->key = $key;
}
public function value($value)
{
switch ($this->key) {
case 'summonerId':
$this->summonerId = $value;
break;
case 'totalSessionsPlayed':
echo "{$this->summonerId},{$this->championId},$value\n";
break;
}
}
}
$stream = fopen('data.json', 'r');
$listener = new ListMatchUps();
try {
$parser = new JsonStreamingParser_Parser($stream, $listener);
$parser->parse();
} catch (Exception $e) {
fclose($stream);
throw $e;
}
आउटपुट:
24570940,110,3
24570940,112,45
555555,42,65
555555,88,99
पुल पार्सर
यह एक पार्सर का उपयोग कर रहा है जिसे मैंने हाल ही में लिखा है, pcrov/jsonreader (PHP 7 की आवश्यकता है)
वही data.json ऊपर जैसा है।
उदाहरण:
use pcrov\JsonReader\JsonReader;
$reader = new JsonReader();
$reader->open("data.json");
while($reader->read("summonerId")) {
$summonerId = $reader->value();
$reader->next("stats");
foreach($reader->value() as $championId => $stats) {
echo "$summonerId, $championId, {$stats['totalSessionsPlayed']}\n";
}
}
$reader->close();
आउटपुट:
24570940, 110, 3
24570940, 112, 45
555555, 42, 65
555555, 88, 99