如何跟踪语音 SDK 内存使用情况

选择编程语言

语音 SDK 基于一个本机代码库,该库可以通过一系列互操作性层投影成多种编程语言。 每种特定于语言的投影都有从从习惯上来说是正确的功能,用于管理对象生命周期。 此外,语音 SDK 还包括具有对象日志记录功能和对象限制的内存管理工具,用于跟踪资源使用情况。

如何读取对象日志

如果启用了语音 SDK 日志记录,则会发出跟踪标记来启用历史对象观察。 这些标记包括:

  • TrackHandleStopTracking
  • 对象类型
  • 受跟踪的对象的数目、对象的类型,以及当前受跟踪的数目。

下面是一个示例日志:

(284): 8604ms SPX_DBG_TRACE_VERBOSE:  handle_table.h:90 TrackHandle type=Microsoft::CognitiveServices::Speech::Impl::ISpxRecognitionResult handle=0x0x7f688401e1a0, ptr=0x0x7f688401e1a0, total=19

设置警告阈值

可以创建警告阈值。如果超出该阈值(假定启用了日志记录),则会记录一条警告消息。 警告消息包含所有存在的对象及其计数的转储。 可以通过此信息更好地了解问题。

若要启用警告阈值,必须在 SpeechConfig 对象上指定它。 创建新的识别器时,将检查此对象。 在下面的示例中,假设已创建一个名为 configSpeechConfig 实例:

config.SetProperty("SPEECH-ObjectCountWarnThreshold", "10000");
config->SetProperty("SPEECH-ObjectCountWarnThreshold", "10000");
config.setProperty("SPEECH-ObjectCountWarnThreshold", "10000");
speech_config.set_property_by_name("SPEECH-ObjectCountWarnThreshold", "10000")?
[config setPropertyTo:@"10000" byName:"SPEECH-ObjectCountWarnThreshold"];

提示

此属性的默认值是 10,000。

设置错误阈值

使用语音 SDK,可以设置在给定时间允许的最大对象数。 如果启用此设置,则达到最大数目时,将无法尝试创建新的识别器对象。 现有对象会继续发挥作用。

下面是一个示例错误:

Runtime error: The maximum object count of 500 has been exceeded.
The threshold can be adjusted by setting the SPEECH-ObjectCountErrorThreshold property on the SpeechConfig object.
Handle table dump by object type:
class Microsoft::CognitiveServices::Speech::Impl::ISpxRecognitionResult 0
class Microsoft::CognitiveServices::Speech::Impl::ISpxRecognizer 0
class Microsoft::CognitiveServices::Speech::Impl::ISpxAudioConfig 0
class Microsoft::CognitiveServices::Speech::Impl::ISpxSpeechConfig 0

若要启用错误阈值,必须在 SpeechConfig 对象上指定它。 创建新的识别器时,将检查此对象。 在下面的示例中,假设已创建一个名为 configSpeechConfig 实例:

config.SetProperty("SPEECH-ObjectCountErrorThreshold", "10000");
config->SetProperty("SPEECH-ObjectCountErrorThreshold", "10000");
config.setProperty("SPEECH-ObjectCountErrorThreshold", "10000");
speech_config.set_property_by_name("SPEECH-ObjectCountErrorThreshold", "10000")?
[config setPropertyTo:@"10000" byName:"SPEECH-ObjectCountErrorThreshold"];

提示

对于 size_t 数据类型,此属性的默认值为特定于平台的最大值。 典型识别会消耗 7 到 10 个内部对象。

后续步骤