大きなファイルのストリーミング
ファイルをチャンク単位で処理します
「大きなファイルのストリーミング」はCoddyKit上の無料Dart Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDart Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Dart Academyコースには全4レッスンが含まれています。
すべてを読み込まない理由
readAsString はファイル全体をメモリに読み込みます。巨大なログや動画ではプログラムがクラッシュする可能性があるため、代わりにストリーム処理を行います。
Read Streamを開く
Fileに対してopenReadを呼び出すと、バイトのチャンクを受け取るストリームを取得できます。各チャンクを処理したら、古いチャンクは破棄します。
final stream = File('big.log').openRead();チャンクを順に処理する
await forを使うと、到着したチャンクを順番に受け取れます。ファイルがどれだけ大きくなっても、メモリ使用量は一定に保たれます。
await for (final chunk in stream) { use(chunk); }バイトはデコードが必要
各チャンクは生のバイトです。テキストとして読み取るには、ストリームをutf8.decoderに通し、代わりにStringの一部を受け取ります。
stream.transform(utf8.decoder);行に分割する
デコーダーの後ろにLineSplitterをつなぐと、ストリームから1行ずつ整った形で出力され、すぐに処理できます。
stream.transform(utf8.decoder).transform(LineSplitter());低コストで行数を数える
これで、100万行のファイルでも軽快に行数を数えられます。ファイル全体を保持せず、ループ内でカウンターを1ずつ増やします。
var n = 0; await for (final l in lines) n++;Write Streamを開く
大きな出力を書き込む場合は、openWriteが返すIOSinkに少しずつデータを渡し、処理しながらディスクへ書き出します。
final sink = File('out.txt').openWrite();Sinkにデータを渡す
ループ内でsink.writeまたはsink.writelnを使ってテキストを送ります。呼び出すたびにデータが追加でストリームに流れ、大きなStringを作り直す必要がありません。
for (final row in rows) sink.writeln(row);Sinkは必ず閉じる
処理が終わったらcloseを呼び出してawaitします。これにより最後のバイトが書き出され、ファイルハンドルが適切に解放されます。
await sink.close();ストリームをSinkに接続する
ファイルを効率よくコピーするには、読み取りストリームをpipeで書き込み用のSinkに直接接続します。Dartがバックプレッシャーを処理してくれます。
await source.openRead().pipe(target.openWrite());ストリームのエラーを処理する
ストリームは途中で失敗することがあります。ループをtry/catchで囲み、読み取りエラーによって結果が気付かないうちに壊れないようにします。
try { await for (final c in stream) {} } catch (e) {}クイックチェック
小さなマシンで5 GBのログを処理する必要があります。適切な方法はどれでしょうか。
まとめ
これで、openReadによるストリーム読み取り、デコードと行分割、IOSinkへの段階的な書き込み、そして高速なコピーのためのpipeを使えるようになりました。
AI チューターと学ぶ Dart — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「大きなファイルのストリーミング」レッスンは無料ですか?
はい。「大きなファイルのストリーミング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Dart Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Dart Academyコースには全4レッスンが含まれています。
「大きなファイルのストリーミング」で何を学びますか?
ファイルをチャンク単位で処理します ブラウザで直接実行するハンズオンコードでDart Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Dart Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDart Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「大きなファイルのストリーミング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDart Academyレッスンでコードを書いて実行できますか?
はい。すべてのDart Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ファイルの読み書き
- ディレクトリ、パス、FileSystemEntity
- 大きなファイルのストリーミング
- Stdin、Stdout、Process Args