UDFでユーザー管理のキャッシュ領域がほしい

前田 健太郎

前田 健太郎

#Snowflake

/tmp/dev/shmが使えた。
Snowpark Optimized Warehouseに新たなユースケースを見出したかもしれない。

なぜほしいか?

ファイルパスで非構造化ファイルを受け取るライブラリはよくある
例えば、画像処理ライブラリのPillowはImage.open(image_path)のようにファイルパスを受け取る。他にも、MLモデルや動画ファイルをファイルパスとして渡すことはよくあると思う。

ただ、UDFからほとんどの領域は書き込み権限がない。
PermissionError: [Errno 1] Operation not permitted

結論

冒頭に述べた通り、実はUDFからでも /tmp/dev/shmなら自由に書き込みができる。
それぞれの領域の実体はワーカーノードのSSDとRAMに存在する。
どちらも一時的な領域なので、次のUDF実行時には削除されている。

/tmpと/dev/shmの違い

パス実体容量IO速度
/tmpSSD400GB普通
/dev/shmRAM16GB爆速

以下にPython UDFで読み書きの例を示す。

/tmpにPILで画像を書き込んで読み込む

from PIL import Image import io image :Image = ... image_path = '/tmp/sample_image.png' image.save(image_path) loaded_image = Image.open(image_path)

/dev/shmにjsonでJSONを書き込んで読み込む
RAMなので速い。

import json from pathlib import Path sample_dict={"message":"/dev/shm is writable !"} path = Path('/dev/shm/info.json') path.write_text(json.dumps(sample_dict)) loaded_sample_json = json.loads(path.read_text())

検証方法

/以下を全て列挙して、全部のフォルダのR/W権限を見た。

import os from pathlib import Path def find_writable_dirs(): permissions = {} base_path = Path('/') for dir_path in base_path.rglob('*'): try: if dir_path.is_dir() and os.access(dir_path, os.W_OK): permissions[str(dir_path)] = { 'readable': os.access(dir_path, os.R_OK), 'writable': os.access(dir_path, os.W_OK) } except PermissionError: pass return permissions

/tmp/dev/shmに書き込めるらしい。

{ "permissions": { "/tmp": { "readable": true, "writable": true }, "/dev/shm": { "readable": true, "writable": true } } }

まとめ

画像を全て/dev/shmに配置して解析の高速化とかできそうですね。
Snowpark Optimized Warehouseの巨大メモリを使えば、、
Snowpark Optimized Warehouse、まさかこうやって使うのか、、、!?

おすすめの記事