我在代码中有一种情况,即有一个庞大的函数可以逐行解析记录,验证并写入另一个文件。
如果文件中有错误,它会调用另一个拒绝记录的函数并写入拒绝原因。
由于程序中存在内存泄漏,它会与SIGSEGV崩溃。从崩溃的位置“重新启动”文件的一种解决方案是将最后处理的记录写入简单文件。
要实现此目的,需要将处理循环中的当前记录号写入文件。如何确保在循环内的文件上覆盖数据?
使用fseek首先在循环中定位/回放会降低性能吗?
记录数量有时很多(最多500K)。
感谢。
编辑:内存泄漏已经修复。重启解决方案被建议为 一个额外的安全措施和提供重启机制以及SKIP n记录解决方案的方法。很抱歉没有提到它。
答案 0 :(得分:6)
答案 1 :(得分:2)
如果您可以更改代码以将最后处理的记录写入文件,为什么不能更改它以修复内存泄漏?
在我看来,这是一个更好的解决方案,可以解决问题的根本原因,而不是治疗症状。
fseek()
和fwrite()
会降低性能,但远不及打开/写入/关闭类型操作。
我假设您将ftell()
值存储在第二个文件中(这样您就可以从中断的地方继续)。您应始终fflush()
该文件,以确保将数据从C运行时库写入OS缓冲区。否则,您的SEGV将确保该值不是最新的。
答案 2 :(得分:2)
不是写出整个记录,而是在每个记录的开头调用ftell()并写入文件指针的位置可能更容易。当你必须重新启动程序时,fseek()到文件中的最后一个写入位置并继续。
当然,修复内存泄漏最好;)
答案 3 :(得分:0)
如果为每条记录写入最后处理的位置,这将对性能产生显着影响,因为您需要提交写入(通常通过关闭文件),然后再次重新打开该文件。在其他作品中,fseek是你最不担心的。
答案 4 :(得分:0)
我会停止挖掘更深的洞,然后通过Valgrind运行程序。这样做可以避免泄漏,以及其他问题。