MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách lặp lại đúng cách qua một tệp json lớn

Bạn sẽ muốn sử dụng trình phân tích cú pháp trực tuyến. Những điều này chỉ kéo các phần nhỏ của tệp của bạn vào bộ nhớ tại một thời điểm.

Chúng có một số hương vị khác nhau:bộ phân tích cú pháp đẩy giống SAX và bộ phân tích cú pháp kéo. Mô hình trình đọc XML:SAX so với trình phân tích cú pháp kéo XML cung cấp tổng quan về sự khác biệt.

Trình phân tích cú pháp đẩy

Đây là một ví dụ nhanh bằng cách sử dụng salsify / json-streaming-parser.

Khi nó cuộn qua tệp, chúng tôi sẽ theo dõi summonerId , championId và trạng thái. Tất cả đều dựa trên sự kiện - bạn không có quyền truy cập ngẫu nhiên với trình phân tích cú pháp tuần tự, vì vậy bạn phải tự theo dõi mọi thứ. Mỗi lần một totalSessionsPlayed xuất hiện, nó sẽ phát ra summonerId , ChampionId totalSessionsPlayed .

data.json

Đây là một tệp json được ghép nối cho mục đích trình diễn.

[
    {
        "_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
            }
        }
    }
]

Ví dụ:

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;
}

Đầu ra:

24570940,110,3
24570940,112,45
555555,42,65
555555,88,99

Trình phân tích cú pháp kéo

Điều này đang sử dụng trình phân tích cú pháp mà tôi đã viết gần đây, pcrov / jsonreader (yêu cầu PHP 7.)

Cùng data.json như trên.

Ví dụ:

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();

Đầu ra:

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. Sắp xếp bằng cách sử dụng MongoEngine?

  2. Chuẩn bị máy chủ MongoDB để sản xuất

  3. Khuôn khổ tổng hợp MongoDB $ group có thể trả về một mảng giá trị không?

  4. Cài đặt / thiết lập Mongos trong Elastic Beanstalk

  5. Truy vấn tổng hợp trung bình Mongo không có nhóm