Erlang消费者队列

时间:2015-07-15 02:14:38

标签: io erlang queue throughput

我有一个问题,我想将离散的数据块从磁盘拉入队列将它们出列到另一个进程中。该数据随机地位于磁盘上,因此不会从顺序读取中获益。它有很多数据,所以我不能一次加载所有数据,也不能一次拉入一个块。

我希望消费者能够以自己的速度运行,但要保持一个健康的数据队列,以便我在处理数据块时不会经常等待磁盘读取。

有没有既定的方法来做到这一点?即工作框架还是安全阀门?实现这一点就像重新发明轮子一样,因为操作磁盘数据的慢速消费者是一个常见问题。

有关如何最好地解决 Erlang 方式的任何建议吗?

1 个答案:

答案 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字节,则无法获得性能提升。

你对你提到的尺寸一直模糊不清,但似乎玩弄缓冲区尺寸应该是实现你所需要的一个不错的开端。