循环中的fseek /倒带

时间:2009-03-03 05:47:57

标签: c performance fseek

我在代码中有一种情况,即有一个庞大的函数可以逐行解析记录,验证并写入另一个文件。

如果文件中有错误,它会调用另一个拒绝记录的函数并写入拒绝原因。

由于程序中存在内存泄漏,它会与SIGSEGV崩溃。从崩溃的位置“重新启动”文件的一种解决方案是将最后处理的记录写入简单文件。

要实现此目的,需要将处理循环中的当前记录号写入文件。如何确保在循环内的文件上覆盖数据?

使用fseek首先在循环中定位/回放会降低性能吗?

记录数量有时很多(最多500K)。

感谢。

编辑:内存泄漏已经修复。重启解决方案被建议为 一个额外的安全措施和提供重启机制以及SKIP n记录解决方案的方法。很抱歉没有提到它。

5 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

如果您可以更改代码以将最后处理的记录写入文件,为什么不能更改它以修复内存泄漏?

在我看来,这是一个更好的解决方案,可以解决问题的根本原因,而不是治疗症状。

fseek()fwrite()会降低性能,但远不及打开/写入/关闭类型操作。

我假设您将ftell()值存储在第二个文件中(这样您就可以从中断的地方继续)。您应始终fflush()该文件,以确保将数据从C运行时库写入OS缓冲区。否则,您的SEGV将确保该值不是最新的。

答案 2 :(得分:2)

不是写出整个记录,而是在每个记录的开头调用ftell()并写入文件指针的位置可能更容易。当你必须重新启动程序时,fseek()到文件中的最后一个写入位置并继续。

当然,修复内存泄漏最好;)

答案 3 :(得分:0)

如果为每条记录写入最后处理的位置,这将对性能产生显着影响,因为您需要提交写入(通常通过关闭文件),然后再次重新打开该文件。在其他作品中,fseek是你最不担心的。

答案 4 :(得分:0)

我会停止挖掘更深的洞,然后通过Valgrind运行程序。这样做可以避免泄漏,以及其他问题。