ZBLOG

15.7. Reduce memory usage A great number of modern systems have tight constraints on available memory, making the reduction of memory usage to a minimum critical. Reducing memory consumption of a Fast DDS application can be achieved through vario...

15.7. 减少内存使用

在许多现代系统中,内存可用性受到严格限制,因此将内存使用量降低到最低限度至关重要。通过多种方法可以减少Fast DDS(数据分发服务)应用程序的内存消耗,这主要是通过对应用程序的架构进行重组,同时也可以通过限制中间件所使用的资源以及避免静态分配来实现。

15.7.1. 限制资源

ResourceLimitsQosPolicy 控制服务可以使用的资源,以满足施加的要求。它限制每个 DataWriterDataReader 可以管理的分配内存量,具体参数包括:

  • 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7526

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?