>백엔드 개발 >Golang >Go에서 대규모 스트리밍 JSON 데이터를 효율적으로 디코딩하려면 어떻게 해야 합니까?

Go에서 대규모 스트리밍 JSON 데이터를 효율적으로 디코딩하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-18 22:49:10263검색

How Can I Efficiently Decode Large Streaming JSON Data in Go?

대형 스트림 JSON을 효율적으로 디코딩

거대한 JSON 배열은 한 번에 디코딩할 때 메모리 문제를 일으킬 수 있습니다. 이 문제를 해결하려면 요소를 하나씩 반복하는 스트리밍 접근 방식을 사용하는 것이 좋습니다.

요소별 JSON 요소 스트리밍

encoding/json 패키지는 다음을 제공합니다. JSON 데이터를 스트리밍하는 방법입니다. 예는 다음과 같습니다.

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!"}
        ]`
    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // skip the opening bracket
    dec.Token()

    // read and process each element
    for dec.More() {
        var message Message
        if err := dec.Decode(&message); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%v: %v\n", message.Name, message.Text)
    }

    // skip the closing bracket
    dec.Token()
}

이 코드에서는 json.NewDecoder를 사용하여 JSON 스트림용 디코더를 생성합니다. 그런 다음 여는 괄호와 닫는 괄호({ 및 })를 건너뛰고 dec.More()를 사용하여 스트림을 반복하여 처리할 요소가 더 있는지 확인합니다.

각 요소에 대해 메시지 구조체를 생성합니다. dec.Decode를 사용하여 JSON 데이터를 디코딩합니다. 그런 다음 메시지의 이름 및 텍스트 필드를 인쇄합니다.

이 접근 방식을 사용하면 전체 배열을 메모리에 로드하지 않고도 대규모 JSON 배열을 처리할 수 있으므로 메모리 부족 오류를 방지하고 성능을 향상시킬 수 있습니다.

위 내용은 Go에서 대규모 스트리밍 JSON 데이터를 효율적으로 디코딩하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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