MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

एक बड़ी जोंस फ़ाइल के माध्यम से ठीक से पुनरावृति कैसे करें

आप स्ट्रीमिंग पार्सर का उपयोग करना चाहेंगे। ये एक बार में आपकी फ़ाइल के केवल छोटे हिस्से को ही मेमोरी में खींच लेते हैं।

वे दो अलग-अलग स्वादों में आते हैं:सैक्स-जैसे पुश पार्सर्स, और पुल पार्सर्स। 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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. इन्सर्ट (), इन्सर्टऑन (), और इन्सर्टमैनी () मेथड में क्या अंतर है?

  2. डार्कशील्ड के साथ MongoDB, Cassandra, और Elasticsearch में मास्किंग PII:…

  3. MongoDB के साथ स्प्रिंग डेटा रिएक्टिव रिपोजिटरी

  4. MongoDB:एकाधिक संग्रह से डेटा को एक में कैसे मिलाएं?

  5. शून्य मान के साथ MongoDB प्रश्न