c-多个小malloc对一个大malloc



任务是将二进制文件解析到内存中。然而,我不知道需要分配多少内存。

哪种方法更可取:在解析例程的过程中执行多个小malloc,还是先遍历文件以决定所需的内存量,然后再次解析?

任何提示都将不胜感激。

在几乎所有情况下,一个大的分配比许多小的分配要好。这样可以防止碎片化,减少系统调用。它通常通过更好的局部性来获得更好的性能。

一种常见的技术是先分配一个较小的分段,然后以固定因子(通常为1.5)重新分配一个较大的分段。在收集完所有元素之后,如果认为过度分配过大,则可以将内存固定为最大大小。

无论如何:首先实现最简单的一个。如果您有性能问题:基准测试。然后进行优化。事实可能证明,分配甚至不是你的瓶颈。

编辑:正如R..提到的,通过推理内存上限及其与文件长度的关系,您可能会很好地了解应该分配多少。大多数好的二进制格式在头段中也包含长度和大小信息。如果你能通过一点算术和/或文件查找来计算出数据结构所需的确切大小,那么你就是赢家。

您有没有考虑过可能使用mmap()?有关详细信息,请参阅此链接。基本上,您只需将文件映射到内存中,并将其作为内存块进行访问,从而完全避免malloc()

这是一个经典的时空权衡。假设您需要整个内容,那么分配大量的小块可能比分配一个大块效率低。

理想情况下,文件格式应该对元数据进行编码,如块的大小、块的计数等。考虑到磁盘访问的延迟与内存的速度相比,读取文件以确定所需的大小可能需要更长的时间。

最有效的方法还取决于需要多少处理。您提到解析,但它是一个二进制文件。假设您需要遍历许多块和可变大小的结构?

有几个策略你可以尝试:

  • 如果文件不是太大而无法放入内存,则可以查询文件系统以查看文件有多大,将其作为一个大块读取,然后在内存中将其拆开。这将非常快,但需要大量内存。

  • 根据二进制文件的结构,您可能可以执行一些fseek()调用来计算需要读取的块有多大(如果您不需要整个文件),然后只读取这些块。

  • 您可以使用mmap()将文件映射到内存中,并让运行时管理将数据分页到内存中。

遍历文件以确定其大小和所需的内存量绝对不是一种方法——磁盘I/O非常昂贵。

另一种选择是获取文件大小,然后分配内存。有关如何获取文件大小的详细信息,请参阅本问答。然而,这种方法也不是有效的。

总而言之,这实际上取决于你如何读取数据和解析数据。例如,有几个相当大的数据块和异步文件I/O可能最适合你。但这是一项相对复杂的任务。

可能最简单、最有效的方法是使用mmap并将文件的内容"映射"到内存中。

没有一般的答案,至少部分原因是你没有定义"优选"。最简单吗?最快?需要最少的堆?另外,你所说的"解析二进制文件"是什么意思?解析通常是为了创建数据结构而对人类可读的文本进行的操作。

每个CCD_ 7通常具有较小的开销。然而,除非最终的数据结构庞大,否则不太可能产生任何重大影响。

使用干净的接口生成最清晰的代码,以便以后可以替换分配方法。然后,只有在您知道存在问题后才考虑优化。

相关内容

  • 没有找到相关文章

最新更新