嵌入式系统中读取文件的内存碎片

Memory Fragmentation from reading file in Embedded System

我在带有 Linux OS 的嵌入式系统上有一个配置文本文件。 要求是文件是文本,嵌入式系统有 32 兆字节的动态内存。该应用程序。将读取文件的代码是用 C++ 编写的。

可以使用这样的方法读取文件。

#include <string>
#include <fstream>

ifstream infile ("config_file_path");    
if (infile.good())
{
    string line;   
    // Set capacity to length of the longest line.
    const unsigned char maxLen = 100;

    line.reserve (maxLen);

    while (std::getline (infile, line))
    { 
        // Process the data in the line.
        processData (line);
    }
}

堆碎片会成为此实现的问题吗? 该文件最多可以包含大约 150 行文本。

很难说您的应用程序是否存在代码内存碎片问题。 (您的代码可能会增加一些碎片,但我不知道它有多重要) 您可以尝试使用非标准的 malloc 库 - jemalloc nedmalloc tcmalloc 它们可能会为您提供更好的对象布局以及转储内存布局的能力

一般方法:

检查应用程序是否可以获取 "not enough memory"。压力测试可能会有所帮助。 检查您的应用程序有多少可用内存以及它的碎片化程度。 如果碎片是问题 - 请尝试以下操作: heap 喜欢 LIFO 原则(删除最后创建的块)。尝试将变量保存在堆栈中。使用专门的分配器。

如果你的函数是:

为了最小化堆压力,您可以尝试将行读入堆栈缓冲区(例如使用 fgets)

Would heap fragmentation be an issue for this implementation?

在显示的示例中,我无法识别指示堆碎片的行。

您正在使用 std::string 对象,其内部机制通常被认为是不可预测的,即对象将增长到多大以及何时释放内存等等。

  • 第一步考虑std::string::capacity以确保更紧凑的内存。

  • 作为第二步,考虑提供 custom allocators,一般免费存储(堆)的具体替代方案是:Pool堆栈.

  • 作为最后一步,考虑使用较少抽象的代码,即指针、数组等,当您更接近硬件时,这是不可避免的解决方案。特别是当您使用该对象只是为了提取输入并作为参数传递时,即不使用任何 std::string 特定成员函数等