嵌入式系统中读取文件的内存碎片
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
特定成员函数等
我在带有 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
特定成员函数等