«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как эффективно маршалировать большие потоки данных в JSON без загрузки в память?

Как эффективно маршалировать большие потоки данных в JSON без загрузки в память?

Опубликовано 31 октября 2024 г.
Просматривать:619

How to Efficiently Marshal Large Data Streams in JSON without Loading into Memory?

Маршалинг больших потоков данных в JSON без загрузки в память

Часто возникает необходимость кодировать большие потоки данных в JSON, но загружая весь поток в память сразу может оказаться непрактичным. В этой статье рассматриваются способы решения этой проблемы без встроенного интерфейса json.Marshaler.

Кодирование с помощью json.Encoder: ограничение

Попытки кодировать большой поток данных с помощью json.Encoder выйдет из строя из-за неспособности обрабатывать каналы (строки каналов) в памяти.

Пользовательское кодирование JSON

При отсутствии подходящей встроенной -в решении становится необходимой специальная кодировка JSON. Это предполагает создание строки JSON вручную, как показано в фрагменте ниже:

w := os.Stdout
w.WriteString(`{ "Foo": "`   t.Foo   `", "Bar": [`)

for x := range t.Bar {
    _ = json.NewEncoder(w).Encode(x)
    w.WriteString(`,`)
}

w.WriteString(`]}`)

Расширение кодирования/json для поддержки каналов

Чтобы улучшить пакет кодирования/json за счет поддержки каналов, вы можете изменить параметр ReflectValueQuoted функция в кодировке/json/encode.go. В частности, добавьте регистр для каналов, подобный следующему:

case reflect.Chan:
    e.WriteByte('[')
    i := 0
    for {
        x, ok := v.Recv()
        if !ok {
            break
        }
        if i > 0 {
            e.WriteByte(',')
        }
        e.reflectValue(x)
        i  
    }
    e.WriteByte(']')

Заключение

Хотя пакет кодирования/json в настоящее время не поддерживает кодирование каналов, в этой статье представлены альтернативные подходы к маршалированию больших потоков данных. в JSON эффективно. Пользовательское кодирование позволяет передавать данные непосредственно в вывод JSON, а расширение кодирования/json предлагает более надежное решение.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3