0Pricing
Dart Academy · Lekcja

Strumieniowe przetwarzanie dużych plików

Przetwarzanie plików fragment po fragmencie

Strumieniowe przetwarzanie dużych plików to bezpłatna lekcja Dart Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Dart Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Dart Academy zawiera 4 lekcji w sumie.

Dlaczego nie odczytać wszystkiego

readAsString wczytuje cały plik do pamięci. W przypadku ogromnego dziennika lub filmu może to zakończyć się awarią programu, dlatego zamiast tego należy użyć stream.

Otwieranie strumienia odczytu

Wywołaj openRead na obiekcie File, aby uzyskać strumień fragmentów bajtów. Przetwarzaj każdy fragment i zwalniaj poprzednie.

final stream = File('big.log').openRead();

Przechodzenie przez fragmenty

Użyj await for, aby odbierać kolejne fragmenty w miarę ich napływania. Zużycie pamięci pozostaje stałe, niezależnie od rozmiaru pliku.

await for (final chunk in stream) { use(chunk); }

Bajty wymagają dekodowania

Każdy fragment zawiera surowe bajty. Aby odczytać tekst, przepuść strumień przez utf8.decoder, aby zamiast tego otrzymywać fragmenty typu String.

stream.transform(utf8.decoder);

Podział na wiersze

Dodaj LineSplitter za dekoderem, a strumień będzie emitować po jednym uporządkowanym wierszu naraz, gotowym do przetworzenia.

stream.transform(utf8.decoder).transform(LineSplitter());

Liczenie wierszy bez dużych kosztów

Teraz policzenie wierszy w pliku zawierającym milion wierszy jest proste i nie obciąża pamięci. Zwiększaj licznik wewnątrz pętli, nigdy nie przechowując całego pliku.

var n = 0; await for (final l in lines) n++;

Otwieranie strumienia zapisu

Zapisujesz duży wynik? openWrite zwraca obiekt IOSink, do którego stopniowo przekazujesz dane, zapisując je na dysku w miarę postępu.

final sink = File('out.txt').openWrite();

Przekazywanie danych do ujścia

W pętli wysyłaj tekst za pomocą sink.write lub sink.writeln. Każde wywołanie przesyła więcej danych bez konieczności tworzenia od nowa ogromnego obiektu String.

for (final row in rows) sink.writeln(row);

Zawsze zamykaj ujście

Po zakończeniu wywołaj close i użyj await. Spowoduje to zapisanie ostatnich bajtów i prawidłowe zwolnienie uchwytu pliku.

await sink.close();

Przekazywanie strumienia do ujścia

Aby wydajnie skopiować plik, przekaż strumień odczytu bezpośrednio do ujścia zapisu za pomocą pipe. Dart automatycznie obsłuży kontrolę przepływu.

await source.openRead().pipe(target.openWrite());

Obsługa błędów strumienia

Strumienie mogą zakończyć się błędem w trakcie działania. Umieść pętlę w bloku try/catch, aby błąd odczytu nie spowodował po cichu uszkodzenia wyników.

try { await for (final c in stream) {} } catch (e) {}

Szybkie sprawdzenie

Musisz przetworzyć dziennik o rozmiarze 5 GB na małym komputerze. Jakie podejście jest właściwe?

Podsumowanie

Potrafisz już odczytywać dane strumieniowo za pomocą openRead, dekodować je i dzielić na wiersze, stopniowo zapisywać przez IOSink oraz używać pipe do szybkiego kopiowania.

Często zadawane pytania

Czy lekcja „Strumieniowe przetwarzanie dużych plików” jest bezpłatna?

Tak — pełny tekst „Strumieniowe przetwarzanie dużych plików” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Dart Academy, przejdź na CoddyKit PRO. Kurs Dart Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Strumieniowe przetwarzanie dużych plików”?

Przetwarzanie plików fragment po fragmencie Ćwiczysz Dart Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Dart Academy?

Nie wymagamy żadnego doświadczenia. Dart Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Strumieniowe przetwarzanie dużych plików”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Dart Academy?

Tak. Każda lekcja Dart Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Odczyt i zapis plików
  2. Katalogi, ścieżki i FileSystemEntity
  3. Strumieniowe przetwarzanie dużych plików
  4. Stdin, Stdout i argumenty procesu
← Powrót do Dart Academy