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
- Odczyt i zapis plików
- Katalogi, ścieżki i FileSystemEntity
- Strumieniowe przetwarzanie dużych plików
- Stdin, Stdout i argumenty procesu