我有两个进程,其中一个是写入(追加)到一个文件,另一个是从中读取。两个进程同时运行,但不进行通信。另一个读者进程可以在编写器进程完成之前开始。
这种方法有效,但read()经常返回读取零字节而没有错误。它们的零长度读取与非零长度读取的比率很高,这是低效的。
这有什么办法吗?这是在POSIX文件系统上。
答案 0 :(得分:3)
没有通信通道,在读取正在写入的文件时,没有保证的方法可以防止零字节读取甚至长时间挂起而不读取任何数据。 Id
的Linux实现使用tail
来有效地创建通信通道并获取有关文件写入活动的信息。
这是一个非常有趣的问题,IBM甚至published a Redbook描述了一个能够以大约15 GB /秒的速度执行“read-behind-write”的实现:
Read-behind-write是一些高端客户使用的技术 降低延迟并提高性能。后读写技术 意味着一旦作家开始写作,读者就会 立即落后于阅读;这个想法是重写写作 读取时间的时间。这个概念对于慢速机器是有益的 I / O性能。对于高I / O吞吐量机器,如pSeries 690,可能值得考虑首先写出整个文件 并行然后并行读取数据。
有许多方法可以实现read-behind-write。在里面 由Xdd实现的方案,在写入一条记录之后,它会 在作者继续之前等待读者阅读该记录。 虽然这种方案使作者和读者保持同步 记录分开,需要系统时间来进行锁定 作者和读者之间的同步。
如果一个人不关心读者落后的记录数量 作者,然后可以实现一个程序供作者流 尽可能快地写下来。作者可以更新全局 写入一定数量的记录后的变量。读者可以 然后拉出全局变量以找出它有多少记录 读取。
如果没有通信渠道,您几乎不得不继续尝试,可能会在一些零字节inotify
结果后调用sleep()
或类似内容。