我正在生成一个文本文件,最终将包含大约十亿个条目。该文件由一个每隔几秒钟写入一次的程序生成。为此,它总是打开文件然后关闭它,因此文件不会一直以写入模式打开。由于整个过程需要很长时间,我想执行“wc -l < file_name”来查看已经有多少条目(一个条目 = 一行)。
但我想知道这是不是一个坏主意?由于 wc 需要几分钟来计算所有行数,因此它会在我的程序写入文件时读取文件。我不在乎 wc 计算的行数和实际行数之间是否存在细微差异。我更担心我的程序无法将数据写入文件。
这会发生在我的 Linux 系统上吗?
答案1
这通常是通过锁. 有两种锁在 Linux 中,是建议性的和强制性的。
咨询锁需要竞争进程之间的合作,IE,即每个进程首先检查文件上是否存在锁,然后根据锁的存在(=等待)或不存在(=读/写)采取行动。强制锁定则赋予一个进程禁止其他进程对锁定文件采取行动的权限。
你没有说明哪种进程正在写入你的大文件,所以我不知道这两种选择中哪一种最合适。我可能会建议一个很好的介绍由于缺乏更多信息,因此无法回到主题。
答案2
我不是文件句柄管理细节方面的专家,但我一眼就看出这里不存在问题。只要 programA 是写作并且程序B是阅读,应该没有问题。
虽然输出结果可能不一致wc
,但我不明白为什么只因为读取了文件就损坏了写入文件的数据。如果你有两个程序写作对于同一个文件,情况就不同了。
因此,锁确实是处理重叠文件访问的最佳方式,但如果您所做的只是用来监控进度,则不需要它们wc
。我已经做了数千次同样的事情,没有问题。但是,您可以考虑在脚本中添加一个打印到标准错误的进度计,或者tail -f
在生成的文件上使用。