15.7. 减少内存使用
在许多现代系统中,内存可用性受到严格限制,因此将内存使用量降低到最低限度至关重要。通过多种方法可以减少Fast DDS(数据分发服务)应用程序的内存消耗,这主要是通过对应用程序的架构进行重组,同时也可以通过限制中间件所使用的资源以及避免静态分配来实现。
15.7.1. 限制资源
ResourceLimitsQosPolicy 控制服务可以使用的资源,以满足施加的要求。它限制每个 DataWriter 或 DataReader 可以管理的分配内存量,具体参数包括:
max_samples:配置 DataWriter 或 DataReader 可以管理的最大样本数,即它代表中间件可以为 DataReader 或 DataWriter 存储的最大样本数。
max_instances:配置 DataWriter 或 DataReader 可以管理的最大实例数。
max_samples_per_instance:控制单个实例中 DataWriter 或 DataReader 可以管理的最大样本数。
allocated_samples:声明在初始化时将分配多少样本。
所有这些参数都可以根据需要降低,以减少内存消耗,并限制应用程序所需资源。下面是一个最低资源限制可能配置示例。
警告
max_samples 的值必须大于或等于 max_samples_per_instance 的值。
HistoryQosPolicy 的深度设置必须小于或等于 max_samples_per_instance 所声明的值。
ResourceLimitsQosPolicy resource_limits;
// ResourceLimitsQosPolicy 默认构造时 max_samples = 5000
// 将 max_samples 更改为最小值
resource_limits.max_samples = 1;
// ResourceLimitsQosPolicy 默认构造时 max_instances = 10
// 将 max_instances 更改为最小值
resource_limits.max_instances = 1;
// ResourceLimitsQosPolicy 默认构造时 max_samples_per_instance = 400
// 将 max_samples_per_instance 更改为最小值
resource_limits.max_samples_per_instance = 1;
// ResourceLimitsQosPolicy 默认构造时 allocated_samples = 100
// 不分配样本
resource_limits.allocated_samples = 0;
对于 XML 配置文件,可以如下定义:
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<data_writer profile_name="data_writer_min_samples">
<topic>
<historyQos>
<kind>KEEP_LAST</kind>
<depth>1</depth>
</historyQos>
<resourceLimitsQos>
<max_samples>1</max_samples>
<max_instances>1</max_instances>
<max_samples_per_instance>1</max_samples_per_instance>
<allocated_samples>0</allocated_samples>
</resourceLimitsQos>
</topic>
</data_writer>
<data_reader profile_name="data_reader_min_samples">
<topic>
<historyQos>
<kind>KEEP_LAST</kind>
<depth>1</depth>
</historyQos>
<resourceLimitsQos>
<max_samples>1</max_samples>
<max_instances>1</max_instances>
<max_samples_per_instance>1</max_samples_per_instance>
<allocated_samples>0</allocated_samples>
</resourceLimitsQos>
</topic>
</data_reader>
</profiles>
15.7.2. 设置动态分配
默认情况下,MemoryManagementPolicy 设置为 PREALLOCATED_WITH_REALLOC_MEMORY_MODE
,这意味着在初始化期间会分配所需内存。如果运行时需要更多内存,则会重新分配。
使用 RTPSEndpointQos 的动态设置将防止不必要的分配。最低内存占用是通过 DYNAMIC_RESERVE_MEMORY_MODE
实现的,但代价是更高的分配次数,在这种模式下,内存在需要时才会被分配,并且一旦停止使用就立即释放。为了在较小内存成本下实现更高确定性,可以选择 DYNAMIC_REUSABLE_MEMORY_MODE
选项,该选项类似于前者,但一旦多余内存被分配,就不会释放,而是用于未来消息的重用。
RTPSEndpointQos endpoint;
endpoint.history_memory_policy = eprosima::fastdds::rtps::DYNAMIC_REUSABLE_MEMORY_MODE;
对于 XML 配置文件,可以如下定义:
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<data_writer profile_name="data_writer_low_memory">
<!-- ... -->
<historyMemoryPolicy>DYNAMIC_REUSABLE</historyMemoryPolicy>
</data_writer>
<data_reader profile_name="data_reader_low_memory">
<!-- ... -->
<historyMemoryPolicy>DYNAMIC_REUSABLE</historyMemoryPolicy>
</data_reader>
</profiles>
总结
通过上述方法,可以有效地减少 Fast DDS 应用程序中的内存使用。这涉及到优化资源限制和选择适当的内存管理策略,从而确保系统在有限条件下仍能高效运行。
内容由零声教学AI助手提供,问题来源于学员提问