Потоковая обработка 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 — локальная установка не требуется.
Все уроки этого курса
- Чтение файлов с os и bufio
- Запись файлов и временные файлы
- Кодирование и декодирование JSON
- Потоковая обработка JSON и CSV