🫢

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

2024/02/05に公開

/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、まさかこうやって使うのか、、、!?

Snowflake Data Heroes

Discussion