在嵌入式应用程序中,我需要将二进制文件读入有限的内存中, 然后在最短的时间内解析它。
可以读取整个文件并分配内存:
char **array = malloc(sizeof(char *) * row);
for(char c = 0; c < 240; c++){ /*320 x 240 file*/
array[c] = malloc(320);
}
这将导致至少 240 个指针,每个指针 4 字节
或者:
array = malloc(320*240);
这最小化了指针,但会导致每次访问时发生乘法 解析。如果没有硬件倍增,时间成本将会非常昂贵。
为了进行解析,内存中一次至少需要三行。
从SD卡读取速度很慢,我不确定是否一次读取一行 解析会比一次读取整个文件然后解析慢。
这个问题的答案将决定内存大小的要求 处理器。当然,较小的处理器会更便宜,这是一个巨大的 因素,但解析时间可能是一个更大的因素。
最佳答案
在不知道可用的文件访问器方法是什么的情况下,很难给出完整的建议,但您可能需要考虑使用 fread 之类的方法一次读取指定大小的 block ,然后使用它来不断填充(正如已经说过的)一个 3 缓冲区集。所以类似:
FILE *fileStream = fopen ("file.bin", "rb");
char **array = malloc(sizeof(char *) * 3);
int i = 0;
size_t bytesRead = 0;
while (!feof(fileStream))
{
for (i = 0; i < 3; i++)
{
/* If read has returned some bytes - i.e. not at EOF */
if (fread (&array[i], 1, 320, fileStream))
{
/* Assuming target knows size of array. Pass in number in iteration
* so target function knows where the read ends */
doProcessing (array, i);
}
}
}
这将允许文件流在其自己的内部缓冲区中处理您关心的 IO 缓冲等,然后您可以使用 fread 来读取点菜。
但是在这么说时,我做了几个假设:
- 可以使用 fread 函数来访问此 SD 卡
- 基于“行”的结构实际上对于您正在解析的二进制文件来说是合理的,并且您不必存储为每行或换行符分隔集填充的字节数数据。
关于c - 如何在最小化时间的同时最小化指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24670062/