2

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

4

1 に答える 1