ジェネレータとSQL
SQL の結果をなめたいがメモリにぜんぶ展開すると out of memory になりがちなところ、 チャンクを次々とジェネレータで供給するというパターンを思いついた。これならほぼ定数メモリで大量のデータを処理できる。
ジェネレータは Iterator を実装しているので、SPL のイテレータにわたすこともできる。
function chunk(SQL $query, int $size) : Iterator { $offset = 0; $query->limit($size); while ($result = fetch_all($query)) { yield from $result; $query->offset($offset += $size); } } $query = sql("SELECT * FROM sakila.film"); // SQL を表すナニカ foreach (chunk($query, $size = 1000) as $film) { # do useful stuff }
実際は offset ではなく、id ベースでたどるのがよさそうではある。
ファイルの中身をまるごとURLエンコードしたい
curl -X POST -d ...
で投げるときに、ファイルの内容をエンコードする必要に見舞われた。
$ perl -MURI::Escape -E 'say uri_escape do { local $/; <STDIN> }' < file.txt
[追記]
-0777
オプションでまるごと読み込みができる。
$ perl -MURI::Escape -0777 -E 'say uri_escape <>' < file.txt