我有一个问题,我想将离散的数据块从磁盘拉入队列,将它们出列到另一个进程中。该数据随机地位于磁盘上,因此不会从顺序读取中获益。它有很多数据,所以我不能一次加载所有数据,也不能一次拉入一个块。
我希望消费者能够以自己的速度运行,但要保持一个健康的数据队列,以便我在处理数据块时不会经常等待磁盘读取。
有没有既定的方法来做到这一点?即工作框架还是安全阀门?实现这一点就像重新发明轮子一样,因为操作磁盘数据的慢速消费者是一个常见问题。
有关如何最好地解决 Erlang 方式的任何建议吗?
答案 0 :(得分:1)
您可以使用file:open/2
上的{read_ahead, Bytes}
选项:
{read_ahead, Size}
此选项激活读取数据缓冲。如果
read/2
调用的次数远远少于Size
,则仍会对Size
个字节的块执行对操作系统的读操作。额外数据在后续read/2
次调用中进行缓冲和返回,从而降低了操作系统调用次数,从而提高了性能。
read_ahead
模式中read_line/1
函数也高度利用了raw
缓冲区,为什么在使用该函数访问原始文件时建议使用此选项(出于性能原因)。如果
read/2
调用的大小不会小于或大于Size
字节,则无法获得性能提升。
你对你提到的尺寸一直模糊不清,但似乎玩弄缓冲区尺寸应该是实现你所需要的一个不错的开端。