【问题标题】:Creating a function to create array from file: which approach would be more efficient?创建一个从文件创建数组的函数:哪种方法更有效?
【发布时间】:2016-04-28 09:07:57
【问题描述】:

我正在考虑编写一个函数,该函数创建一个数组以使用 calloc 从文件中存储数据(目前为字符形式)。 据我了解,我的两个最明显的选择是读取所有字符以获得所需的总大小,使用 calloc 分配所需的空间,然后使用 fseek 到达文件的开头,并在返回之前填充数组指向数组的指针。 第二种选择是创建一个小的初始数组,在我复制时根据需要不断添加 realloc 以添加块,并且在 realloc 失败的情况下,在释放旧 calloc 之前将所有数据传输到新的更大尺寸的新 calloc,并且读取所有内容后,返回数组指针。

问题真的是,realloc 在处理大型数据集时失败的可能性有多大,好像不是我认为第二种方法在这种情况下会有优势。

据我所知,创建一个大数组然后根据需要缩小会比较棘手,所以我没有将它列为一个选项;如果我错了,请指出。

【问题讨论】:

  • 您只阅读了文件的一部分就感到不舒服吗?读完整个文件,你还能活下去吗?
  • 这更像是一个理论问题——我既想知道实现该功能的最佳方法,也想知道如果我愿意的话能够读取整个文件。实际上,我不太可能将它用于任何大到第一个版本无法正常工作的东西。
  • 如果你正在读取一个行长不等的文本文件,问题就比较棘手了,除非你想把整个文件读入一个内存块然后遍历它。
  • 什么操作系统?确实没有严格兼容的独立于操作系统的方法来使用 C 确定文件的大小。
  • 我正在考虑通读直到 EOF,并增加一个计数值以确定数组大小

标签: c arrays dynamic


【解决方案1】:

无论您是根据内存不足的可能性还是性能来判断质量,都不需要考虑第二种和第三种情况,因为第一种情况显然是赢家。除了不要阅读每个字符以获得所需的总大小。使用二进制文件并寻尾;获得位置(即长度),然后回到起点。这在几乎所有可以想象的场景中都是即时的,而且肯定不会比阅读每个角色更糟糕。当然,无论 realloc 多么有效,它都不会比只分配一次更好。而且,如果您以性能来判断质量,那么您现在可能已经对其进行了测试。

【讨论】:

  • 为了严格遵守,您不能在二进制文件末尾使用fseek 来查找其长度。根据 7.21.9.2 the C Standardfseek 函数二进制流不需要有意义地支持 whence 值为 SEEK_ENDfseek 调用。
  • fseek()/ftell() 确实可行,但问题已离开操作系统。
  • 还不错。 Orangesandlemons,我概述的方法将适用于 9999 系统,因此您必须退后一步,喝几杯啤酒,然后等待它在第 10000 个系统上崩溃,然后修复那个系统。否则,您可能会浪费大量时间编写或复制无法在 9950 系统上运行的数兆字节的操作系统可移植性代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多