>백엔드 개발 >Golang >Go에서 메모리에 완전히 로드하지 않고 대규모 JSON 배열을 어떻게 효율적으로 처리할 수 있나요?

Go에서 메모리에 완전히 로드하지 않고 대규모 JSON 배열을 어떻게 효율적으로 처리할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-25 09:00:14300검색

How can I efficiently process large JSON arrays without loading them entirely into memory in Go?

대형 스트림 JSON 디코딩

파일에 저장된 대규모 JSON 배열을 처리할 때 전체 배열을 메모리에 로드하지 않는 것이 중요합니다. 메모리 오류. 대신 JSON 데이터 요소를 요소별로 스트리밍하는 것이 좋습니다.

이를 달성하기 위한 한 가지 접근 방식은 인코딩/json 문서에 설명되어 있습니다.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "strings"
)

func main() {
    const jsonStream = `
                [
                    {"Name": "Ed", "Text": "Knock knock."},
                    {"Name": "Sam", "Text": "Who's there?"},
                    {"Name": "Ed", "Text": "Go fmt."},
                    {"Name": "Sam", "Text": "Go fmt who?"},
                    {"Name": "Ed", "Text": "Go fmt yourself!"}
                ]
            `
    type Message struct {
        Name, Text string
    }
    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // read open bracket
    t, err := dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

    // while the array contains values
    for dec.More() {
        var m Message
        // decode an array value (Message)
        err := dec.Decode(&m)
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%v: %v\n", m.Name, m.Text)
    }

    // read closing bracket
    t, err = dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

}

이 샘플 코드:

  • 문자열에서 JSON 데이터를 읽기 위해 디코더 객체(dec)를 생성합니다.
  • 디코더는 토큰을 하나씩 읽습니다. 하나는 배열의 여는 괄호로 시작합니다.
  • for 루프는 배열 요소를 반복하여 각 요소를 메시지 구조체로 구문 분석합니다.
  • 각 메시지의 이름과 텍스트가 인쇄됩니다.
  • dec.More() 함수가 표시하는 배열에 더 이상 사용할 수 있는 요소가 없을 때까지 루프가 계속됩니다.
  • 마지막으로 디코더는 배열의 닫는 괄호를 읽고 인쇄합니다.

이 접근 방식을 사용하면 전체 데이터 구조를 메모리에 로드하지 않고도 대규모 JSON 배열을 스트리밍할 수 있어 리소스 사용이 최적화되고 효율적인 처리가 가능해집니다.

위 내용은 Go에서 메모리에 완전히 로드하지 않고 대규모 JSON 배열을 어떻게 효율적으로 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.