-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path20200828slide.tex
More file actions
408 lines (326 loc) · 11.3 KB
/
Copy path20200828slide.tex
File metadata and controls
408 lines (326 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
\documentclass[aspectratio=169,dvipdfmx,14pt,notheorems]{beamer}
%%%% 和文用 %%%%%
\usepackage{bxdpx-beamer}
\usepackage{pxjahyper}
\usepackage{minijs}%和文用
\renewcommand{\kanjifamilydefault}{\gtdefault}%和文用
%%%% スライドの見た目 %%%%%
\usetheme{Madrid}
\usefonttheme{professionalfonts}
\setbeamertemplate{frametitle}[default][center]
\setbeamertemplate{navigation symbols}{}
\setbeamercovered{transparent}%好みに応じてどうぞ)
\setbeamertemplate{blocks}[rounded]
\useinnertheme{circles}
\setbeamertemplate{footline}[page number]
\setbeamerfont{footline}{size=\normalsize,series=\bfseries}
\setbeamercolor{footline}{fg=black,bg=black}
%%%%
%%%% 定義環境 %%%%%
\usepackage{amsmath,amssymb}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{theorem}{定理}
\newtheorem{definition}{定義}
\newtheorem{proposition}{命題}
\newtheorem{lemma}{補題}
\newtheorem{corollary}{系}
\newtheorem{conjecture}{予想}
\newtheorem*{remark}{Remark}
\renewcommand{\proofname}{}
%%%%%%%%%
%%%%% フォント基本設定 %%%%%
\usepackage[T1]{fontenc}%8bit フォント
\usepackage{textcomp}%欧文フォントの追加
\usepackage[utf8]{inputenc}%文字コードをUTF-8
\usepackage[deluxe]{otf}%otfパッケージ
\usepackage{lxfonts}%数式・英文ローマン体を Lxfont にする
\usepackage{bm}%数式太字
%%%%%%%%%%
%%%%% PythonTeX %%%%%
\usepackage[makestderr]{pythontex}
\restartpythontexsession{\thesection}
\title{インメモリーストリーム活用術}
\subtitle{How to Use In-Memory Streams}
\author[Hayao]{Hayao Suzuki}
\institute[PyCon JP 2020]{PyCon JP 2020}
\date{August 29, 2020}
\begin{document}
\begin{frame}[plain]\frametitle{}
\titlepage %表紙
\end{frame}
\begin{frame}\frametitle{発表に際して}
\begin{block}{GitHubに資料があります}
\begin{itemize}
\item \url{https://github.com/HayaoSuzuki/pyconjp2020}
\end{itemize}
\end{block}
\begin{block}{Twitterのハッシュタグ}
\begin{itemize}
\item \#pyconjp\_1
\end{itemize}
\end{block}
\begin{block}{PyCon JP Fellow Slack}
\begin{itemize}
\item \#jp-2020-track-1
\end{itemize}
\end{block}
\end{frame}
\section{Self Introduction}
\begin{frame}\frametitle{Who am I ?}
\begin{block}{お前誰よ}
\begin{description}
\item[Name] Hayao Suzuki(鈴木 駿)
\item[Twitter] \href{https://twitter.com/CardinalXaro}{@CardinalXaro}
\item[Work] Python Programmer at iRidge, Inc.
\end{description}
\end{block}
\end{frame}
\begin{frame}\frametitle{Who am I ?}
\begin{block}{Technical Reviewer}
\begin{itemize}
\item \structure{Effective Python 第2版}(O'Reilly Japan)
\item \structure{動かして学ぶ量子コンピュータプログラミング}(O'Reilly Japan)
\end{itemize}
\end{block}
\url{https://xaro.hatenablog.jp/}にリストがあります。
\end{frame}
\begin{frame}\frametitle{Who am I ?}
\begin{block}{Selected Talks}
\begin{itemize}
\item \structure{レガシーDjangoアプリケーションの現代化}(DjangoCongress JP 2018)
\item \structure{SymPyによる数式処理}(PyCon JP 2018)
\item \structure{Pythonと楽しむ初等整数論}(PyCon mini Hiroshima 2019)
\item \structure{君はcmathを知っているか}(PyCon mini Shizuoka 2020)
\end{itemize}
\end{block}
\url{https://xaro.hatenablog.jp/}にリストがあります。
\end{frame}
\begin{frame}\frametitle{今日の目標}
\begin{block}{こんな課題を解決したい!}
\begin{itemize}
\item インターネット経由で数GBサイズのデータを取得し、CSVファイルに加工する
\item クラウド上に構築した既存のシステムに追加する形で実装する
\item 毎日実行する
\end{itemize}
\end{block}
\begin{alertblock}{クラウドサービスは従量課金}
なるべく迅速に処理したい!
\end{alertblock}
\end{frame}
\begin{frame}\frametitle{今日の目標}
\begin{block}{処理の流れ}
\begin{itemize}
\item インターネット経由で数GBサイズのデータを取得する
\item 数GBサイズのデータをCSVファイルに加工する
\item CSVファイルをZIP圧縮する
\item ZIP圧縮データをクラウドストレージにアップロードする
\end{itemize}
\end{block}
\begin{exampleblock}{分析}
\begin{itemize}
\item データサイズが大きい
\item データの加工は単純な処理
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}\frametitle{今日の目標}
\begin{block}{ボトルネックはどこか}
\begin{itemize}
\item ZIP圧縮はそれほど大変ではない
\item データ加工は単純な処理
\item ボトルネックはI/O処理にありそう
\end{itemize}
\end{block}
何とかしてI/O処理を迅速に処理したい!!!
\end{frame}
\begin{frame}\frametitle{Today's Theme}
\begin{center}
\huge{In-Memory Streams}
\end{center}
\end{frame}
\section{built-in function: open}
\begin{frame}\frametitle{Stream?}
\begin{block}{そもそもストリームって何?}
ストリームはファイルオブジェクトである。
\end{block}
\end{frame}
\begin{frame}\frametitle{File Object?}
\begin{block}{ファイルオブジェクトって何?}
\begin{itemize}
\item \texttt{read()}や\texttt{write()}などのメソッドを持つオブジェクト
\item ディスク上のファイルや別の場所にあるストレージ、入出力機器とやりとりができる
\end{itemize}
\end{block}
\end{frame}
\begin{frame}\frametitle{File Object?}
\begin{block}{ファイルオブジェクトたち}
\begin{itemize}
\item 生バイナリファイル
\item バッファ付きバイナリファイル
\item テキストファイル
\end{itemize}
\end{block}
\end{frame}
\subsection{open is useful}
\begin{frame}[fragile]\frametitle{使い方}
\begin{exampleblock}{テキストファイル}
\begin{pygments}{python}
f = open("myfile.txt", "r")
\end{pygments}
\end{exampleblock}
\begin{exampleblock}{バッファ付きバイナリ}
\begin{pygments}{python}
f = open("myfile.jpg", "rb")
\end{pygments}
\end{exampleblock}
\end{frame}
\subsection{open with Disk IO}
\begin{frame}\frametitle{\texttt{open}関数の裏側}
\begin{block}{\texttt{open}は何をしているのか?}
OSのシステムコールAPIを呼ぶ
\end{block}
\end{frame}
\begin{frame}[fragile]\frametitle{\texttt{open}関数の裏側}
\begin{exampleblock}{例:CSVに加工する}
\begin{pygments}{python}
with open("events.csv", "w") as csv_file:
fieldnames = ["title", "started_at", "ended_at"]
writer = csv.DictWriter(csv_file, fieldnames)
writer.writeheader()
writer.writerows(events)
\end{pygments}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]\frametitle{\texttt{open}関数の裏側}
\begin{exampleblock}{例:Windows}
\begin{itemize}
\item CreateFile(ファイルのアクセス権取得)
\item QueryAllInformationFile(ファイル情報の取得)
\item WriteFile(ファイルへ書き込む)
\item CloseFile(ファイルを閉じる)
\end{itemize}
\end{exampleblock}
Process Monitor経由で確認した。
\end{frame}
\begin{frame}[fragile]\frametitle{\texttt{open}関数の裏側}
\begin{exampleblock}{例:Ubuntu on WSL}
\begin{itemize}
\item openat (ファイルのオープン)
\item fstat(ファイル情報の取得)
\item ioctl(デバイス制御)
\item lseek(ファイルのシーク)
\item write(ファイルへ書き込む)
\item close(ファイルを閉じる)
\end{itemize}
\end{exampleblock}
\texttt{strace}経由で確認した。
\end{frame}
\begin{frame}\frametitle{最後に笑うのは誰だ}
\begin{block}{最終的な成果物はどこに置く?}
\begin{itemize}
\item ファイルをローカルに保存するのがゴールではない
\item ファイルをAWS S3などの外部に置きたい
\end{itemize}
\end{block}
ローカルデバイスにファイルを書き込みたくない!
\end{frame}
\begin{frame}\frametitle{Today's Theme}
\begin{center}
\huge{In-Memory Streams}
\end{center}
\end{frame}
\section{In-Memory Streams}
\begin{frame}\frametitle{インメモリーストリーム}
\begin{block}{インメモリーストリームとは}
\begin{itemize}
\item \texttt{str}や\texttt{bytes}をファイルオブジェクトのように扱える
\item 読み書き可能、ランダムアクセス可能
\end{itemize}
\end{block}
\end{frame}
\subsection{StringIO}
\begin{frame}[fragile]\frametitle{\texttt{StringIO}}
\begin{block}{\texttt{StringIO}}
テキストファイルのためのインメモリストリーム
\end{block}
\begin{exampleblock}{例:CSVを\texttt{StringIO}で取り扱う}
\begin{pygments}{python}
import io
with io.StringIO() as csv_file:
fieldnames = ["title", "started_at", "ended_at"]
writer = csv.DictWriter(csv_file, fieldnames)
writer.writeheader()
writer.writerows(events)
\end{pygments}
\end{exampleblock}
\end{frame}
\subsection{BytesIO}
\begin{frame}[fragile]\frametitle{\texttt{BytesIO}}
\begin{block}{\texttt{BytesIO}}
バッファ付きバイナリファイルのためのインメモリストリーム
\end{block}
\begin{exampleblock}{例:PNGを\texttt{BytesIO}で取り扱う}
\begin{pygments}{python}
import io
with io.BytesIO(png_bytes) as f:
png_header = f.read(8)
print(png_header) # b'\x89PNG\r\n\x1a\n'
\end{pygments}
\end{exampleblock}
\end{frame}
\section{Case Study}
\begin{frame}\frametitle{復習:今日の目標}
\begin{block}{処理の流れ}
\begin{itemize}
\item インターネット経由で数GBサイズのデータを取得する
\item 数GBサイズのデータをCSVファイルに加工する
\item CSVファイルをZIP圧縮する
\item ZIP圧縮データをクラウドストレージにアップロードする
\end{itemize}
\end{block}
\end{frame}
\subsection{ZIP Compression in Memory using StringIO and BytesIO}
\begin{frame}[fragile]\frametitle{データをインターネット経由で取得する}
\begin{exampleblock}{例:Connpass APIをコールする}
\begin{pygments}{python}
with urllib.request.urlopen(url) as response:
events = json.load(response)["events"]
\end{pygments}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]\frametitle{データを加工する}
\begin{exampleblock}{例:APIの取得結果をCSVにする}
\begin{pygments}{python}
with io.StringIO() as ts:
header = ["title", "started_at", "ended_at"]
writer = csv.DictWriter(ts, fieldnames=header)
writer.writeheader()
writer.writerows(events)
\end{pygments}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]\frametitle{データを圧縮\&アップロード}
\begin{exampleblock}{例:ZIPに圧縮してAWS S3にアップロード}
\begin{pygments}{python}
with io.BytesIO() as bs:
with zipfile.ZipFile(bytes_stream, "w") as zf:
zf.writestr("events.csv", ts.getvalue())
bs.seek(0) # ファイルシークがポイント
s3.upload_fileobj(bs, "bucket", "events.zip")
\end{pygments}
\end{exampleblock}
\end{frame}
\section{Conclusion}
\begin{frame}[fragile]\frametitle{Conclusion}
\begin{block}{まとめ}
\begin{itemize}
\item \texttt{io}モジュールにはインメモリーストリームが含まれる。
\item \texttt{str}や\texttt{bytes}をファイルオブジェクトのように扱うことができる。
\item 通常の\texttt{open}と異なりシステムコールが呼ばれない。
\item ディスクへのI/Oを減らしたい、またはできない状況下での利用が最適である。
\end{itemize}
\end{block}
\texttt{io}モジュールを皆様の道具箱に入れてください!
\end{frame}
\end{document}