[Snowflake]UDFでユーザー管理のキャッシュ領域がほしい
/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速度 |
---|---|---|---|
/tmp | SSD | 400GB | 普通 |
/dev/shm | RAM | 16GB | 爆速 |
以下に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、まさかこうやって使うのか、、、!?
Snowlfake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion