注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
Foundry在磁盘上以高度优化的格式缓存时间序列数据以便于时间序列查询。查询这些数据需要使用计算秒数。
时间序列查询以以下方式使用计算:
对较大时间序列索引的查询将读取更多的点。以下部分提供了关于如何计算的说明。
请注意,当您为Foundry的使用付费时,每个查询会消耗一个固定的、最低的计算秒数。默认数量为4
计算秒数。这是服务查询所需的基础计算使用。如果您与Palantir有企业合同,请在进行计算使用计算之前联系您的Palantir代表。
时间序列数据的存储在Foundry存储下测量。存储时间序列数据不使用任何计算;只有索引时间序列和主动查询数据时才会使用计算。
时间序列查询计算专门用于查询存储在Foundry中的时间序列数据。时间序列查询以两种方式使用计算:
以下公式从查询中推导出计算秒数:
Copied!1compute-seconds = 4 + points_scanned / 25000 2# 计算秒数 = 4 + 扫描的点数 / 25000 3# 该公式用于计算操作所需的秒数,其中4是一个常数,points_scanned是扫描点的数量。
资源管理应用程序允许您深入了解数据集使用信息,并应作为在Foundry平台中调查使用情况的起始点。
用户可以在Foundry中使用多种工具来查询时间序列数据。时间序列查询的使用情况始终与每个工具生成或修改的资源相关联。
在按使用合同为Foundry付费时,有三个主要的时间序列查询计算驱动因素:
查询次数
被查询系列的大小
查询的复杂性
有关更多信息和示例,请参见下面的查询复杂性示例部分。
管理查询总数对于管理时间序列查询的总计算使用量很重要。在Foundry中使用时间序列时,请考虑以下做法:
要预测时间序列查询的成本,请务必始终了解被查询系列的大小。
请考虑以下示例,其中有三个查询针对一个具有100,000点的系列,每个查询扫描系列中的所有点:
Copied!1series_size: 100,000 points 2minimum_query_usage: 4-compute seconds 3points_per_compute_second: 25,000 points 4total_queries: 3 5 6# 计算总的计算秒数 7compute-seconds = num_queries * minimum_query_usage + total_points / points_per_compute_second 8compute-seconds = 3 queries * 4 compute-seconds + 100,000 points * 3 queries / 25,000 points-per-second 9compute-seconds = 3 * 4 + 300,000 / 25,000 10compute-seconds = 24 compute-seconds
此代码片段计算了一次操作所需的总计算秒数。每次查询至少使用4个计算秒,并且每秒可以处理25,000个点。总共有3次查询,每次查询需处理100,000个点,最终得出总计算时间为24个计算秒。
当对查询的时间序列应用更多嵌套操作时,时间序列查询的复杂性会增加。
例如,考虑以下FoundryTS代码,该代码将两个时间序列相加,并在1年的时间范围内返回新序列的所有点作为Pandas数据框:
Copied!1series_1 = N.TimeseriesNode('series_1') # 创建时间序列节点 series_1 2series_2 = N.TimeseriesNode('series_2') # 创建时间序列节点 series_2 3result = F.dsl(program='a+b', return_type=float)([series_1, series_2]).time_range(start='2022-01-01', end='2023-01-01') 4# 使用DSL定义程序'a+b',将series_1和series_2相加,并指定返回类型为浮点数。 5# 然后指定时间范围从2022年1月1日到2023年1月1日。 6result.to_pandas() # 将结果转换为Pandas数据框格式
Copied!1{ 2 id: dsl-fomula, // 这是一个DSL公式的ID 3 children: [ 4 { id: timeseries }, // 这是第一个时间序列数据的ID 5 { id: timeseries } // 这是第二个时间序列数据的ID 6 ] 7}
评估 to_pandas
调用将在请求的1年时间范围内扫描 result
时间序列中的点,以及计算结果所需的两个组件序列中的点(在本例中,每个组件序列都有1年的范围)产生成本。
现在,考虑以下应用了更多嵌套操作的 FoundryTS 代码。首先,我们定义一个序列,该序列是另外两个序列的总和。然后,我们将该序列与其7天的滚动平均值进行比较,并将结果中的一年数据加载为一个 Pandas 数据框:
Copied!1series_1 = N.TimeseriesNode('series_1') 2series_2 = N.TimeseriesNode('series_1') # 注意:这里可能是个错误,应该是 'series_2' 3intermediate_1 = F.dsl(program='a+b', return_type=float)([series_1, series_2]) # 计算 series_1 和 series_2 的和 4intermediate_2 = intermediate_1.rolling_aggregate('mean', '7d') # 对 intermediate_1 进行 7 天的滚动平均 5result = F.dsl(program='a-b', return_type=float)([intermediate_1, intermediate_2]).time_range(start='2022-01-01', end='2023-01-01') # 计算 intermediate_1 和 intermediate_2 的差,并限定时间范围 6result.to_pandas() # 将结果转换为 Pandas 数据框格式
此代码将以以下形式向Codex进行查询:
Copied!1{ 2 id: dsl-fomula, // DSL公式节点 3 children: [ 4 { 5 id: dsl-fomula, // 子节点,DSL公式 6 children: [ 7 { id: timeseries }, // 时间序列节点 8 { id: timeseries } // 时间序列节点 9 ] 10 }, 11 { 12 id: rolling-aggregate, // 滚动聚合节点 13 children: [ 14 { 15 id: dsl-fomula, // 子节点,DSL公式 16 children: [ 17 { id: timeseries }, // 时间序列节点 18 { id: timeseries } // 时间序列节点 19 ] 20 } 21 ] 22 } 23 ] 24}
此查询树中的每个节点将产生扫描1年范围点以生成最终结果的成本。