我有两个过程,其中一个正在写(附加)到文件,另一个正在从文件读取。这两个进程正在同时运行,但无法通信。另一个读取器进程可能在写入器进程完成之前开始。
这种方法有效,但read()通常返回已读取零字节且无错误的信息。它们的零长度读取与非零长度读取之比很高,效率很低。
有没有办法解决?这是在POSIX文件系统上。
没有通信通道,就无法保证在读取正在写入的文件时,防止零字节读取甚至长时间挂起而又不读取任何数据的方法。Linux实现的tail用途inotify是有效创建通信通道并获取有关文件写入活动的信息。
tail
inotify
这是一个足够有趣的问题,IBM甚至发布了红皮书,描述了一种能够以大约15 GB /秒的速度进行“后写后写”的实现:
读后写是一些高端客户用来降低延迟并提高性能的技术。后写后写入技术意味着一旦写入器开始写入,读取器将立即落后于读取;这个想法是使写入时间与读取时间重叠。此概念对I / O性能较慢的计算机很有用。对于高I / O吞吐量的机器(例如pSeries 690),可能值得考虑首先并行写入整个文件,然后并行读取数据。 可以实现从后写入的多种方式。在Xdd实现的方案中,写者写完一条记录后,将等待读者读该记录,然后写者才能继续。尽管此方案使写入器和读取器保持同步仅相距一条记录,但是在写入器和读取器之间进行锁定和同步需要花费系统时间。 如果一个人不关心读取器落后于写入器多少记录,那么可以实施一种方案,使写入器尽可能快地降低写入速度。在写入一定数量的记录后,编写者可以更新全局变量。然后,读取器可以拉出全局变量以找出必须读取的记录数。
读后写是一些高端客户用来降低延迟并提高性能的技术。后写后写入技术意味着一旦写入器开始写入,读取器将立即落后于读取;这个想法是使写入时间与读取时间重叠。此概念对I / O性能较慢的计算机很有用。对于高I / O吞吐量的机器(例如pSeries 690),可能值得考虑首先并行写入整个文件,然后并行读取数据。
可以实现从后写入的多种方式。在Xdd实现的方案中,写者写完一条记录后,将等待读者读该记录,然后写者才能继续。尽管此方案使写入器和读取器保持同步仅相距一条记录,但是在写入器和读取器之间进行锁定和同步需要花费系统时间。
如果一个人不关心读取器落后于写入器多少记录,那么可以实施一种方案,使写入器尽可能快地降低写入速度。在写入一定数量的记录后,编写者可以更新全局变量。然后,读取器可以拉出全局变量以找出必须读取的记录数。
如果没有通信通道,您将不得不继续尝试,可能会sleep()在出现多个零字节read()结果后继续拨打电话或进行类似操作。
sleep()
read()