0Pricing
Go Academy · Урок

Потоковая обработка JSON и CSV

json.Decoder и encoding/csv для больших объёмов данных

«Потоковая обработка JSON и CSV» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Зачем нужна потоковая обработка?

Полная загрузка больших файлов JSON или CSV в память приводит к значительному использованию кучи. Потоковая обработка обрабатывает записи по одной и сохраняет потребление памяти постоянным независимо от размера файла.

json.Decoder для потоковой обработки

json.NewDecoder оборачивает любой io.Reader. Используйте Token(), чтобы проходить по потоку токенов JSON, или вызывайте Decode в цикле для массивов JSON.

dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
    var record Record
    dec.Decode(&record)
    process(record)
}

Определение начала массива

Вызовите dec.Token(), чтобы прочитать открывающую скобку перед циклом декодирования:

t, _ := dec.Token() // consume [
for dec.More() {
    var r Record
    dec.Decode(&r)
}

Потоковая обработка из HTTP

Декодируйте JSON непосредственно из тела HTTP-ответа, не буферизуя весь ответ:

resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
    var item Item
    dec.Decode(&item)
    process(item)
}

Средство чтения encoding/csv

csv.NewReader считывает строки CSV по одной. Установите LazyQuotes, TrimLeadingSpace и Comment, чтобы обрабатывать варианты CSV из реальных приложений.

r := csv.NewReader(file)
for {
    record, err := r.Read()
    if err == io.EOF { break }
    if err != nil { return err }
    process(record)
}

Пропуск заголовка CSV

Считайте и отбросьте первую запись, чтобы пропустить строку заголовка:

r.Read() // discard header
for {
    record, err := r.Read()
    if err == io.EOF { break }
}

csv.Writer

Записывайте строки CSV по одной с помощью csv.NewWriter. Всегда вызывайте w.Flush() и проверяйте w.Error() после записи.

w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }

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

В файлах CSV иногда используются точки с запятой или табуляция. Установите r.Comma в нужный символ.

r := csv.NewReader(file)
r.Comma = ';' // semicolon-separated

Потоковые строки JSON (NDJSON)

JSON с разделителями в виде символов новой строки, где один объект JSON занимает одну строку, удобно обрабатывать потоком: считывайте строки по одной и независимо десериализуйте каждую из них.

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    var record Record
    json.Unmarshal(scanner.Bytes(), &record)
}

Профиль памяти при потоковой обработке

При потоковой обработке выделение памяти в куче остаётся равным O(размера записи), а не O(размера файла). Для файла размером 1 GB с записями по 1 KB потоковая обработка использует примерно 1 KB вместо примерно 1 GB при загрузке в память.

Отмена контекста при потоковой обработке

Проверяйте ctx.Done() внутри цикла декодирования, чтобы прервать потоковую обработку после отмены контекста и не дать горутинам продолжать чтение до EOF.

for dec.More() {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
    }
    dec.Decode(&record)
}

Быстрая проверка

В чём преимущество потоковой обработки JSON с помощью json.Decoder по сравнению с json.Unmarshal?

Итоги: потоковая обработка JSON и CSV

Ключевые моменты:

  • json.Decoder: цикл с dec.More() для массивов JSON
  • csv.NewReader: построчное чтение; задавайте Comma для пользовательских разделителей
  • NDJSON: bufio.Scanner + Unmarshal для каждой строки
  • Потоковая обработка сохраняет постоянный объём используемой памяти независимо от размера файла

Часто задаваемые вопросы

Урок «Потоковая обработка JSON и CSV» бесплатный?

Да — полный текст урока «Потоковая обработка JSON и CSV» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Потоковая обработка JSON и CSV»?

json.Decoder и encoding/csv для больших объёмов данных Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Потоковая обработка JSON и CSV»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение файлов с os и bufio
  2. Запись файлов и временные файлы
  3. Кодирование и декодирование JSON
  4. Потоковая обработка JSON и CSV
← Назад к Go Academy