Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
イテレーターとジェネレーターで巨大CSVをサクッとプレビューしたい
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuki Yata
August 17, 2026
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
イテレーターとジェネレーターで巨大CSVをサクッとプレビューしたい
Yuki Yata
August 17, 2026
More Decks by Yuki Yata
See All by Yuki Yata
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
560
ISUCON研修おかわり会 講義スライド
arfes0e2b3c
1
620
新卒0年目がEMの勉強をしてみて 学んだこと、思ったこと
arfes0e2b3c
1
1.3k
YAC2024発表資料(pdf版)
arfes0e2b3c
0
790
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
The Invisible Side of Design
smashingmag
301
52k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Building AI with AI
inesmontani
PRO
1
1.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
KATA
mclloyd
PRO
35
15k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
510
Deep Space Network (abreviated)
tonyrice
0
290
What's in a price? How to price your products and services
michaelherold
247
13k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Transcript
Ginza. j #1 © LayerX Inc. 1
Ginza.js#11 イテレーターとジェネレーターで 巨大CSVをサクッとプレビューしたい yata(@0e2b3c) © LayerX Inc. 2
自己紹介 yata(@0e2b3c) 株式会社 LayerX バクラク人事労務 SWE CSSプロパティのMdn全部読みました スマブラとヨルシカと礼賛と ゆる言語学ラジオが好きです ©
LayerX Inc. 3
今回話すこと イテレーター と ジェネレーター の話をします ↑ を使って重いCSVでもブラウザ上でプレビューできるビューワーをサクッと作れたよ という話もします © LayerX
Inc. 4
1. イテレーターとは © LayerX Inc. 5
1-1. イテレーターとは? 構文やスプレッド構文( ... )などで要素を順番に取ってくるものの中身 配列などを for of に入れると要素が取れるのはイテレーターが実装されているから 逆に言えば、イテレーターを実装すれば好きなオブジェクトをfor
ofで回せる for of 例えばツリーを深さ順にconsoleで出力するとかもできる © LayerX Inc. 6
1-1. イテレーターを構成する3つの要素 イテラブルなオブジェクト: イテレーターを持つオブジェクト 正確には「 [Symbol.iterator] を呼び出した時にイテレーターが返るオブジェクト」 配列や文字列、MapやSetなど イテレーター: 順番にイテレーターリザルトを取り出すことができるオブジェクト
イテレーターリザルトを返却するnext()が実装されている イテレーターリザルト: valueとdoneを持つオブジェクト value: 配列で言うところのそれぞれの要素の値 done: 終了しているかどうかのフラグ © LayerX Inc. 7
1-1. イテレーターを構成する3つの要素 イテラブルなオブジェクト: イテレーターを持つオブジェクト 正確には「 [Symbol.iterator] を呼び出した時にイテレーターが返るオブジェクト」 配列や文字列、MapやSetなど イテレーター: 順番にイテレーターリザルトを取り出すことができるオブジェクト
イテレーターリザルトを返却するnext()が実装されている イテレーターリザルト: valueとdoneを持つオブジェクト value: 配列で言うところのそれぞれの要素の値 done: 終了しているかどうかのフラグ ↑長い! © LayerX Inc. 8
1-1. これだけ覚えて欲しいこと 説明済: for of で回せるものの中にはイテレーターというオブジェクトがいる for of で回すと、イテレーターの中にある next()
というメソッドが呼び出されて、次 の値を取得してくれる next() © LayerX Inc. の呼び出しを繰り返していくことで順番に値が取り出されていく 9
1-2. サンプル: 1〜10 を順番に返すイテラブルなオブジェクト © LayerX Inc. 10
結構書くのめんどくさいな... © LayerX Inc. 11
そんなあなたにジェネレーター関数 © LayerX Inc. 12
2. ジェネレーター関数とは © LayerX Inc. 13
2-1. ジェネレーター関数とは イテレーターを普通の関数の様に実装できる構文 さっきのごちゃごちゃを考えなくて済む © LayerX Inc. 14
2-2. サンプルを書き直してみる 12行のサンプルが... © LayerX Inc. 15
2-2. サンプルを書き直してみる 4行になる の実装も、イテレーターの生成も、 next() の実装も、 イテレーターリザルトの組み立ても、done の管理も、全部 ジェネレーター がやってく
れる 書かなきゃいけないのはコアロジックだけ [Symbol.iterator] © LayerX Inc. 16
2-2. サンプルを書き直してみる 4行になる と書いたらジェネレーター関数になる yield という特殊なキーワードを使う function*() © LayerX Inc.
通常の関数でいう所の return yield まで到達すると値を返すのに加えて、実行がそこで止まる。変数の値を保持したまま止まる 次の next() が呼び出されたら続きから再開する 17
3. ジェネレーター で CSV ビューワーを作ってみた © LayerX Inc. 18
3-1. 作りたいもの 想定:CSV の中身をサッと確認するプレビュー用途 機能は簡素でいい、とにかく軽く速く簡単に実装したい でもどんなに重い CSV でも開けるようにしたい 手元の 320万行・200MB
の CSV (北海道の住所一覧) で検証しました © LayerX Inc. 19
3-2. 素直に実装すると 初期表示 793ms、メモリ 294MB 読み込み中は UI も固まる © LayerX
Inc. 20
3-3. 方針:64KB ずつ読む 全部読むのをやめて、 file.stream() で 64KB ずつ読む stream は非同期イテラブル
→ for await...of で回せる 下までスクロールしたら next() で次の64KBを読んでいく ただし1つ問題が...チャンクはサイズで切られるので、行の真ん中で切れる →チャンクの末尾と次のチャンクの先頭をくっつけてあげる必要がある © LayerX Inc. 21
3-4. まずイテレーターもジェネレーターも使わずに書くと... © LayerX Inc. 22
3-4. まずイテレーターもジェネレーターも使わずに書くと... 何が大変か 「今どこまで読んだか」を 状態変数で管理する必要がある 「読み込み済みから返すか、新しく読むか」の状態遷移の分岐を書く必要がある © LayerX Inc. 23
3-5. ジェネレーター なら 9 行で解決 「どこまで読んだか」は yield の停止位置で分かるので状態遷移も条件分岐も消せる 変数の値を保持し続けられるので、末尾の持ち越しも rest
1 つで済む © LayerX Inc. 24
© LayerX Inc. 25
4. まとめ © LayerX Inc. 26
まとめ イテレーターを使えば何でも for of で回せる ジェネレーター関数を使えばそれを更に簡単に実装できる 大きなデータを扱う時や、状態変数を持っておかないといけない時に便利 © LayerX Inc.
27
ご清聴ありがとうございました! © LayerX Inc. 28