BigQuery JS UDF の制限に問題があります。[1] に記載されている唯一のメモリ制限はapproximately 5 MB or less
、UDF によって出力されるデータ量の制限であるため、出力バッファが ~3MB (base64 変換前) を超えた場合にエラーを返すように内部チェックを設定しました。それでも、一連の行に対して UDF を実行すると制限に達しますが、個別には正常に動作します。
たとえば、これは失敗しますResources exceeded during query execution: UDF out of memory.
WITH joined_data AS
(
SELECT z, x, y, ARRAY_AGG(data) as data
FROM `rmr_tests.z6_pre_agg`
WHERE x = 14
GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt from joined_data
ジョブ ID: cartodb-gcp-backend-data-team:US.bquxjob_1628ffa1_170c4d0d50f
一方、Bigquery をだまして UDF への呼び出しを別の方法でバッチ処理しても、問題はありません。
WITH joined_data AS
(
SELECT z, x, y,
ARRAY_AGG(data) as data,
ABS(MOD(FARM_FINGERPRINT(CONCAT(CAST(x AS STRING), y, CAST(z AS STRING))), 5)) AS r
FROM `rmr_tests.z6_pre_agg`
WHERE x = 14
GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 0
UNION ALL
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 1
UNION ALL
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 2
UNION ALL
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 3
UNION ALL
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 4
ジョブ ID: cartodb-gcp-backend-data-team:US.bquxjob_3f216117_170c4d2abae
重要かどうかはわかりませんが、UDF に渡されるデータは大きくなる可能性があり (この例では最大 20 MB)、出力は BYTE 型です (Length(mvt) で報告される最大サイズは 2.71 MB です)。
過去にも同様の問題があり [2]、v8 で発生する可能性のある問題について言及されていましたが、同じ問題かどうかはわかりません。
これは私の UDF の問題ですか、それとも v8+Bigquery の問題ですか? ノードの下で同等のコードをテストしましたが、メモリは安定したままです (20 ~ 30 分間実行しても目立ったリークはありません)。
[1] - https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions
[2] - https://stackoverflow.com/a/35563562
編集:バグトラッカーで報告しました:https ://issuetracker.google.com/u/1/issues/151212192