Потоковая обработка больших файлов
Обрабатывайте файлы по частям
«Потоковая обработка больших файлов» — бесплатный урок Dart Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.
Почему не прочитать всё сразу
readAsString загружает весь файл в память. Для огромного журнала или видео это может привести к сбою программы, поэтому вместо этого используйте потоковую обработку.
Открытие потока чтения
Вызовите openRead у объекта File, чтобы получить поток фрагментов байтов. Обрабатывайте каждый фрагмент и освобождайте уже обработанные.
final stream = File('big.log').openRead();Обход фрагментов
Используйте await for, чтобы получать каждый фрагмент по мере его поступления. Потребление памяти остаётся постоянным независимо от размера файла.
await for (final chunk in stream) { use(chunk); }Байты нужно декодировать
Каждый фрагмент содержит необработанные байты. Чтобы читать текст, пропустите поток через utf8.decoder и получите вместо этого фрагменты строк.
stream.transform(utf8.decoder);Разделение на строки
Добавьте LineSplitter после декодера, и поток начнёт выдавать по одной аккуратной строке, готовой к обработке.
stream.transform(utf8.decoder).transform(LineSplitter());Подсчёт строк без лишних затрат
Теперь подсчёт строк в файле размером в миллион строк выполняется легко и быстро. Увеличивайте счётчик внутри цикла, не удерживая весь файл в памяти.
var n = 0; await for (final l in lines) n++;Открытие потока записи
Нужно записать большой объём данных? openWrite возвращает IOSink, в который можно постепенно передавать данные, записывая их на диск по мере работы.
final sink = File('out.txt').openWrite();Передача данных в приёмник
Отправляйте текст с помощью sink.write или sink.writeln внутри цикла. Каждый вызов передаёт новые данные, не создавая заново гигантскую строку.
for (final row in rows) sink.writeln(row);Всегда закрывайте приёмник
Завершив работу, вызовите close и дождитесь его выполнения. Это записывает последние байты и корректно освобождает дескриптор файла.
await sink.close();Передача потока в приёмник
Чтобы эффективно скопировать файл, передайте поток чтения напрямую в приёмник записи с помощью pipe. Dart самостоятельно обрабатывает управление скоростью передачи данных.
await source.openRead().pipe(target.openWrite());Обработка ошибок потока
Потоки могут завершиться с ошибкой в середине работы. Оберните цикл в try/catch, чтобы ошибка чтения незаметно не повредила результат.
try { await for (final c in stream) {} } catch (e) {}Быстрая проверка
Вам нужно обработать журнал размером 5 ГБ на маломощном компьютере. Какой подход будет правильным?
Итоги
Теперь Вы умеете читать данные потоково с помощью openRead, декодировать их и разделять на строки, постепенно записывать через IOSink и использовать pipe для быстрого копирования.
Часто задаваемые вопросы
Урок «Потоковая обработка больших файлов» бесплатный?
Да — полный текст урока «Потоковая обработка больших файлов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.
Чему я научусь в уроке «Потоковая обработка больших файлов»?
Обрабатывайте файлы по частям Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Dart Academy?
Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Потоковая обработка больших файлов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Dart Academy?
Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение и запись файлов
- Каталоги, пути и FileSystemEntity
- Потоковая обработка больших файлов
- Stdin, Stdout и аргументы процесса