注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

時系列クエリのコンピュート使用量

Foundry は、時系列クエリ向けに高度に最適化された形式で時系列データをディスクにキャッシュします。このデータをクエリするには、コンピュート秒を使用する必要があります。

時系列クエリでは、次のようにコンピュートを使用します。

  1. クエリごとに固定のコンピュート秒が使用されます。
  2. 各クエリで読み取る時系列ポイントの数に基づいて、追加のコンピュート秒が計測されます。

より大きな時系列インデックスを対象とするクエリでは、より多くのポイントが読み取られます。以降のセクションでは、その計算方法を説明します。

コンピュートの計測方法

Foundry の使用量に応じて料金を支払う場合、クエリごとに固定の最小コンピュート秒が消費されます。デフォルトは 4 コンピュート秒です。これは、クエリを処理するために必要な基本のコンピュート使用量です。Palantir とエンタープライズ契約を締結している場合は、コンピュート使用量を計算する前に Palantir の担当者にお問い合わせください。

時系列データの保存は、Foundry ストレージの使用量として計測されます。時系列データの保存にはコンピュートを使用しません。コンピュートを使用するのは、時系列のインデックス化と、データに対するクエリの実行のみです。

時系列クエリのコンピュートは、Foundry に保存されている時系列データをクエリするときにのみ使用されます。時系列クエリでは、次の2つの方法でコンピュートを使用します。

  1. クエリごとに最小限のコンピュート秒を使用します。従量課金の Foundry インスタンスでは、各クエリで4コンピュート秒を使用します。
  2. クエリ自体で処理対象となるポイントの数に基づいて、使用量が固定の最小コストを超えて増加します。クエリ中にスキャンされるポイントの数は、クエリ対象の時系列のサイズと実行されるロジックの複雑さによって決まります。ロジックが複雑な場合、ポイントに対して多くの比較や操作が行われることがあります。

次の式で、クエリのコンピュート秒を算出します。

compute-seconds = 4 + points_scanned / 25000

時系列クエリの使用量を調査する

Resource Management アプリケーションでは、データセットの使用量情報を掘り下げて確認できます。Foundry プラットフォームの使用量を調査する際は、このアプリケーションから始めることを推奨します。

ユーザーは、Foundry で時系列データをクエリするための複数のツールを利用できます。時系列クエリの使用量は、常に各ツールが生成または変更するリソースに紐づけられます。

  • Quiver では、時系列クエリの使用量は、クエリの開始に使用された個々の Quiver 分析またはダッシュボードに帰属します。
  • Workshop では、クエリは、クエリを開始した Workshop アプリに紐づけられます。Workshop アプリに時系列をクエリする Quiver コンポーネントが埋め込まれている場合も、使用量はそのコンポーネントを含む Workshop アプリケーションに帰属します。
  • FoundryTS ライブラリを使用して時系列をクエリする変換では、そのクエリのコンピュートは、変換が記述されたリポジトリに帰属します。

使用量を左右する要因を理解する

Foundry を従量課金契約で利用する場合、時系列クエリのコンピュート使用量を左右する主な要因は3つあります。

  1. クエリ数

    • 各クエリの最小使用量は4コンピュート秒です。そのため、ユーザーが実行するクエリ、クエリを実行する Quiver ダッシュボード、FoundryTS クエリを実行するスケジュール済みビルドが増えるほど、使用するコンピュート秒も増えます。
  2. クエリ対象の時系列のサイズ

    • 読み取るポイントの数を減らすと、通常はコンピュート使用量と低遅延の指標が低減します。たとえば、10,000,000ポイントの時系列全体を集計するクエリを実行すると、100,000ポイントの時系列に対して同じクエリを実行する場合より多くのコンピュートを使用します。ただし、実際の使用量はクエリによって異なります。読み取るポイントの数を減らす最も一般的な方法は、各時系列に時間範囲フィルターを適用することです。
  3. クエリの複雑さ

    • 基になる時系列に対してより複雑なインタラクションを行うクエリは、その時系列に対してより多くの操作を実行します。これらの操作の実行時に、スキャンされるポイントが増えるほどクエリの使用量も増加します。

    クエリの複雑さに関する詳細と例については、後述のセクションを参照してください。

時系列の使用量を管理する

時系列クエリによるコンピュートの総使用量を管理するには、クエリの総数を管理することが重要です。Foundry で時系列を使用する際は、次の方法を検討してください。

  • 時系列に基づく分析やダッシュボードを作成する際は、更新のたびに実行する必要があるクエリの総数を考慮します。また、パラメーターが変更されたときにすべてのクエリが更新されるわけではないように、更新経路を分けることも検討します。
  • FoundryTS のビルドを実行する際は、必要以上に頻繁にビルドが実行されないように、スケジュールが適切に設定されていることを確認してください。
  • 時系列に時間範囲が適用されると、Foundry の時系列バックエンドは、その時間範囲内のポイントのみを読み取ります。そのため、Foundry の時系列クエリは、クエリ対象の範囲に基づいて最適化できます。クエリの時間範囲を制限すること自体には、コンピュートは不要です。時間範囲を選択すると、スキャンされるポイントの総数を大幅に減らし、クエリで使用するコンピュートを削減できます。
  • 処理に適した粒度を選択します。すべてのワークフローで最も細かい粒度のデータが必要なわけではありません。場合によっては、特定のワークフロー向けに事前集計を行います。ほかのユースケースでは、異なる粒度のデータを別々の時系列に保存します。複数の時系列を最新の状態に保つと、インデックス化のコンピュート使用量が増える場合がありますが、複数の時系列を保存すること自体にはコンピュートは不要です。そのため、異なる粒度の時系列を複数保持する方が、常に最も細かい粒度の時系列をクエリするよりも低コストになる場合があります。

使用量を計算する

時系列クエリのコストを予測するには、クエリ対象の時系列のサイズを必ず把握してください。

次の例では、100,000ポイントの時系列に対して3つのクエリが実行され、それぞれのクエリが時系列内のすべてのポイントをスキャンします。

series_size: 100,000 points
minimum_query_usage: 4-compute seconds
points_per_compute_second: 25,000 points
total_queries: 3

 
compute-seconds = num_queries * minimum_query_usage + total_points / points_per_compute_second
compute-seconds = 3 queries * 4 compute-seconds + 100,000 points * 3 queries / 25,000 points-per-second
compute-seconds = 3 * 4 + 300,000 / 25,000
compute-seconds = 24 compute-seconds

クエリの複雑さの例

クエリ対象の時系列に適用される操作のネストが増えるほど、時系列クエリは複雑になります。

例として、次の FoundryTS コードを考えます。このコードは2つの時系列を加算し、新しい時系列の1年間の時間範囲に含まれるすべてのポイントを Pandas データフレームとして返します。

series_1 = N.TimeseriesNode('series_1')
series_2 = N.TimeseriesNode('series_2')
result = F.dsl(program='a+b', return_type=float)([series_1, series_2]).time_range(start='2022-01-01', end='2023-01-01')
result.to_pandas()

このコードは、次の形式のクエリを Codex に送信します。

{
  id: dsl-fomula
  children: [
    { id: timeseries },
    { id: timeseries }
  ]
}

to_pandas 呼び出しを評価すると、要求された1年間の時間範囲にある result 時系列のポイントのスキャンに加えて、結果の計算に必要な2つの構成時系列のポイント(この場合はそれぞれの1年間の範囲)のスキャンにもコストが発生します。

次に、より多くのネストされた操作を適用する、次の FoundryTS コードを考えます。まず、ほかの2つの時系列の合計となる 時系列を定義します。次に、その時系列を自身の7日間の移動平均と比較し、結果から1年分の ポイントを Pandas データフレームとして読み込みます。

series_1 = N.TimeseriesNode('series_1')
series_2 = N.TimeseriesNode('series_1')
intermediate_1 = F.dsl(program='a+b', return_type=float)([series_1, series_2])
intermediate_2 = intermediate_1.rolling_aggregate('mean', '7d')
result = F.dsl(program='a-b', return_type=float)([intermediate_1, intermediate_2]).time_range(start='2022-01-01', end='2023-01-01')
result.to_pandas()

このコードは、次の形式のクエリを Codex に送信します。

{
  id: dsl-fomula
  children: [
    {
      id: dsl-fomula
      children: [
        { id: timeseries },
        { id: timeseries }
      ]
    },
    {
      id: rolling-aggregate
      children: [
        {
          id: dsl-fomula
          children: [
            { id: timeseries },
            { id: timeseries }
          ]
        }
      ]
    }
  ]
}

このクエリツリーの各ノードで、最終結果を生成するために1年間の範囲のポイントをスキャンするコストが発生します。